您的位置:首页 > 其它

给定一个填充非负数的m×n网格,找到一条从左上到右下的路径,这个路径将所有数字的总和最小化。

2017-12-18 11:27 525 查看
本题源自leetcode  64

-------------------------------------------------------------------

思路 : 动态规划

1 用一个二维数组dp[i][j]记录到达 i,j 所需要的最小路径和。考虑边界条件。

2 优化 :用一个一维数组来记录到达某一列,需要的最小路径和。

代码:

int minPathSum(vector<vector<int>>& grid) {
/*
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
if(col == 0)
return 0;
vector<vector<int>> dp(row,vector<int>(col,0));
dp[0][0] = grid[0][0];
for(int i = 1; i < row; i++)
dp[i][0] = dp[i-1][0] + grid[i][0];
for(int i = 1; i < col; i++)
dp[0][i] = dp[0][i-1] + grid[0][i];
for(int i = 1; i < row; i++)
for(int j = 1; j < col; j++)
dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];
return dp[row-1][col-1];
*/
int row = grid.size(), col = grid[0].size();
vector<int> dp(col,0);
dp[0] = grid[0][0];
for(int j = 1; j < col; j++)
dp[j] = dp[j - 1] + grid[0][j];
for(int i = 1; i < row; i++){
dp[0] += grid[i][0];
for(int j = 1; j < col; j++)
dp[j] = min(dp[j - 1],dp[j]) + grid[i][j];
}
return dp[col - 1];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐