描述
给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
你在同一时间只能向下或者向右移动一步
您在真实的面试中是否遇到过这个题?
这道题是动态规划中的经典例题。
class Solution {
public:
/**
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
int minPathSum(vector<vector<int>> &grid) {
// write your code here
int sizerow=grid.size();
if(sizerow==0) return 0;
int sizecol=grid[0].size();
vector<vector<int>> dp(sizerow,vector<int>(sizecol,0x7FFFFFFF));
for(int i=sizerow-1;i>=0;i--){
for(int j=sizecol-1;j>=0;j--){
if(i==sizerow-1&&j==sizecol-1) dp[i][j]=grid[i][j];
else if(i==sizerow-1&&j<sizecol-1) dp[i][j]=grid[i][j]+dp[i][j+1];
else if(i<sizerow-1&&j==sizecol-1) dp[i][j]=grid[i][j]+dp[i+1][j];
else if(i<sizerow-1&&j<sizecol-1) dp[i][j]=grid[i][j]+((dp[i+1][j]>dp[i][j+1])?dp[i][j+1]:dp[i+1][j]);
}
}
return dp[0][0];
}
};