最近在学习DP 很容易的想到了下面的解法
我的解法
int minPathSum(vector<vector<int> >& grid) {
//handle exception
if (grid.empty())
return 0;
//grid is not null
int m = grid.size();
int n = grid[0].size();
vector<vector<int> > dp(m, vector<int>(n));
//init dp table
//init 0,0 pos
dp[0][0] = grid[0][0];
//init 第一横行
for (int i = 1; i < m; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
//init 第一纵列
for (int j = 1; j < n; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1])
+ grid[i][j];
}
return dp[m -1][n -1];
}
至此AC
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1])
+ grid[i][j];
这个递推式比较关键,ij位置上的minimum path由上方和左方的最小值 加上 grid表中本格的数值相加而成.
贪心的反例(为什么不能用贪心)
A | B | C |
---|---|---|
0 | 1 | 100 |
2 | 100 | 100 |
1 | 1 | 1 |
看这个表格 贪心会导致从0,0 走到 0, 1 然后一定会经过100
而正确走法应当走1, 0
所以这题不能用贪心
优化
这题空间复杂度上可以优化
可以将dp表从二维节约成一维, 在循环中更新表即可, 最后返回所需函数值即可.