来自LeetCode的意外结果(最小路径总和)

时间:2014-01-13 18:30:06

标签: c++

我使用在线编译器来测试我的代码,它运行正常。但是,当我将代码提交给LeetCode时,它总是返回一个随机的负数,如-1218055056。

问题描述如下,

  

给定m x n网格填充非负数,找到从左上角到右下角的路径,这样可以最小化路径上所有数字的总和。

     

注意:您只能在任何时间向下或向右移动。

我的代码如下,

class Solution {
public:
    int sub(vector<vector<int> >& grid, int** dp, int m, int n) {
        if(dp[m][n] == 0) {
            if(m==0 && n==0) {
                *(*(dp+m)+n) = grid.at(m).at(n);
            } else {
                if(m == 0) {
                    *(*(dp+m)+n) = sub(grid, dp, m, n-1);
                } else if(n == 0) {
                    *(*(dp+m)+n) = sub(grid, dp, m-1, n);
                } else {
                    int left = sub(grid, dp, m, n-1);
                    int up = sub(grid, dp, m-1, n);

                    *(*(dp+m)+n) = left<up?grid.at(m).at(n)+left:grid.at(m).at(n)+up;
                }
            }
        }

        return *(*(dp+m)+n);
    }

    int minPathSum(vector<vector<int> > &grid) {
        int m = grid.size();
        int n = grid.at(0).size();
        int** dp = new int*[m];
        for(int i=0; i<m; i++) {
            dp[i] = new int[n];
        }

        return sub(grid, dp, m-1, n-1);
    }
};

有谁知道为什么?

提前致谢。

2 个答案:

答案 0 :(得分:0)

Nabla是对的,用dp[i] = new int[n];替换dp[i] = new int[n]();可以解决问题。

答案 1 :(得分:0)

我对评论的建议:

for(int i=0; i<m; i++) {
    dp[i] = new int[n];
}

return sub(grid, dp, m-1, n-1);

此处dp[i] 零初始化,dp[i]的值不确定,因为dp传递给{{ 1}}。在sub中,值会在分配之前读取,因此行为可能非常意外,特别是sub将从sub返回不确定的值而不执行任何其他操作,如果dp 1}}不是零,因为这个测试:

dp[m][n]

您可能很幸运,代码与您的编译器正确运行。要在声明时正确地初始化值,请使用:

 if(dp[m][n] == 0) {