You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现带记忆化的网格旅行者DP问题大网格返回异常值如何解决

问题原因

你的代码问题出在整数溢出。
Java 中 int 是 32 位有符号整数,取值范围为 -2147483648 ~ 2147483647。18*18 网格的唯一路径总数是组合数 C(34,17) = 2333606220,这个数值已经超过了 int 的最大值,溢出后符号位翻转,就会返回负数结果。

修复方案

把所有存储路径数的变量类型从 int / Integer 改为取值范围更大的 long / Long 即可:

  • 修改函数返回值类型为 long
  • 把 HashMap 的 value 类型改为 Long
  • 基础 case 的返回值改为 long 类型的字面量

修复后的代码如下:

import java.util.HashMap;

public class Test{

    public static void main(String[] args){
        HashMap<String, Long> memo = new HashMap<>();
        System.out.println(gridTraveler(2,2,memo));
        System.out.println(gridTraveler(18,18,memo));
    }

    public static long gridTraveler(int m, int n, HashMap<String, Long> memo){

        String key = "" + m + "," + n;
        //base case
        if(m == 1 || n == 1)
            return 1L;

        //base case
        if(m == 0 || n == 0)
            return 0L;

        if (memo.containsKey(key))
            return memo.get(key);

        memo.put(key, gridTraveler(m-1, n, memo) + gridTraveler(m, n-1, memo));
        return memo.get(key);
    }
}

如果后续需要计算更大尺寸的网格,long 也不足以存储结果时,可以改用 BigInteger 类型实现任意精度的整数存储。


内容的提问来源于stack exchange,提问作者mvey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:39:03