【问题标题】:Strange values when using Memoization for Grid Traveler problem?使用记忆化解决网格旅行者问题时的奇怪值?
【发布时间】:2021-10-16 02:03:26
【问题描述】:

我正在学习动态编程,我刚开始处理一些简单的问题。我正在做一个网格旅行者问题,你从网格的左上角开始,你只能向左或向下移动。您需要返回从网格的左上角到右下角的唯一路径的数量。

当我尝试一些更大的网格时,我得到了一些奇怪的返回值。例如,当我尝试 (18,18) 时,它转到 -> -1961361076 而不是 2333606220

谁能看出我的代码有问题?

'''

import java.util.HashMap;

public class Test{

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

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

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

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

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

        //Set value of the key memo[key]
        memo.put(key, gridTraveler(m-1, n, memo) + gridTraveler(m, n-1, memo));

        return memo.get(key);
    }
}

【问题讨论】:

  • 你只能向左或向下移动 - 你的意思是向右还是向下?如果是这样,请edit 并更改它
  • -1961361076 可能意味着您得到的值大于 In Integer.MAX_VALUE (即 2147483647)。使用双倍。
  • c0der的回答正确,请关闭问题

标签: java memoization


【解决方案1】:

这是因为已达到 Integer 的最大值。当您尝试向其添加值时,它会溢出,并“环绕”到负数。

如果您更改为 Long 而不是 Integer,它将起作用:-

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(long i, long j, HashMap<String, Long> memo){

    String key = "" + i + "," + j;
    //base case
    if(i == 1 || j == 1)
        return (long) 1;

    //base case
    if(i == 0 || j == 0)
        return (long) 0;

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

    //Set value of the key memo[key]
    memo.put(key, gridTraveler(i-1, j, memo) + gridTraveler(i, j-1, memo));

    return memo.get(key);
}
}

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2017-02-14
    相关资源
    最近更新 更多