动态编程算法的结果不正确

时间:2019-07-15 06:34:37

标签: java algorithm dynamic-programming

我正在尝试解决“动态问题”问题,以找到原点和电路板最后一个单元之间的唯一路径。问题在https://leetcode.com/problems/unique-paths/的leetcode上出现。

问题陈述是-

机器人位于m x n网格的左上角(在下图中标记为“开始”)。

机器人只能在任何时间点上下移动。机器人试图到达网格的右下角(在下图中标记为“完成”)。

有多少个可能的唯一路径?

我被困在一个m = 23且n = 12的测试用例上。您能解释一下我代码中的不一致之处吗?

    public int uniquePaths(int m, int n) {
        return getPath(m,n,1,1);
    }

    HashMap<String,Integer> map = new HashMap<>();
    private int getPath(int m, int n, int x, int y){
        if(x == n && y == m) return 1;
        else if(x > n || y > m) return 0;

        String s = ""+x+y;
        if(map.get(s) != null) return map.get(s);

        int max =0;
        if(x < n)
            max = max + getPath(m,n,x+1,y);
        if(y < m)
            max = max + getPath(m,n,x,y+1);

        map.put(s,max);
        return max;
    }
}

在m = 23和n = 12时,我得到192184665作为输出,而193536720是预期结果。

1 个答案:

答案 0 :(得分:1)

调查我的评论。您可以使用自底向上的dp在Sigma(m * n)中解决此问题。

创建一个大小为[m * n]的int矩阵。

int[] a = new int[n][m];

for (int i = 0; i < n-1; ++i) {
  a[i][m-1] = 1;
}

for (int j = 0; i < m-1; ++j) {
  a[n-1][j] = 1;
}


for (int i = n-2; i >= 0; --i) {
  for (int j = m-2; j >= 0; --j) {
    a[i][j] = a[i+1][j] + a[i][j+1];
  }
}

System.out.print(a[0][0]);