题目链接
注意点
- 数字很大,结果可能会溢出
解法
解法一:dp,走到某一格的位置dp值等于它左边和上面格子中较小的dp值加上该位置的值。其实只需要一个一维数组也可以实现。时间复杂度O(mn)
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.size() == 0 || grid[0].size() == 0) return 0;
int m = grid[0].size(),n = grid.size();
int i,j;
long int dp[n][m];
for(i = 0; i < n;i++)
{
for(j = 0;j < m;j++)
dp[i][j] = 0;
}
dp[0][0] = grid[0][0];
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
if(i-1 >= 0 && j-1 >= 0) dp[i][j] = grid[i][j] + min(dp[i-1][j],dp[i][j-1]);
else if(i-1 >= 0 && j-1 < 0) dp[i][j] = grid[i][j] + dp[i-1][j];
else if(i-1 < 0 && j-1 >= 0) dp[i][j] = grid[i][j] + dp[i][j-1];
}
}
return dp[n-1][m-1];
}
};
小结
- 动态规划题