问题描述:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
动态规划:
dp[i][j]表示从左上到达(i, j)的最小值
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j];分别表示从上边和从左边过来
初值:
dp[0][0] = a[0][0];
dp[0][j>0] = dp[0][j-1]+a[0][j];
dp[i>0][0] = dp[i-1]0[] + a[i][0];
复杂度为O(m*n),空间复杂度为O(m*n).
源代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n));
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j){
if(i==0){
if(j==0){
dp[i][j] = grid[i][j];
}
else{
dp[i][j] = dp[0][j-1]+grid[0][j];
}
}
else if(j == 0){
dp[i][j] = dp[i-1][0]+grid[i][0];
}
else{
dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];
}
}
}
return dp[m-1][n-1];
}
};