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.
题意:给定一个方格,填满非负的数值,找出从左上角到右下角的一条路径,使路径和最小。只能向下或向右移动。
思路:用一维数组实现,对于第m次循环:更新前:dp[i]表示到达点(m-1, i)的最短路径和,dp[i+1]表示到达点(m-1, i+1)的最短路径和,即更新前存储上一行的点的最短路径,更新后的dp[i-1]表示到达点(m, i-1)的点的最短路径和,即更新后表示该行的最短路径和,更新方法是从左至右依次更新,则到达点(m, i)的最短路径和为:sum = min{ dp[i-1]+grid[m][i], dp[i]+grid[m][i] }, 把sum值存入dp[i],则,更新后,dp[i]即是到达点(m, i)的最小路径和,更新后表示该行的对应值点的最小路径和。由于是从左至右依次更新,所以再利用更新后的dp[i],更新前的dp[i+1],更新dp[i+1]。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if (grid.size() < 0)
return 0;
int m = grid.size();
int n = grid[0].size();
vector<int> dp(grid[0].begin(), grid[0].end());
for (int i = 1; i < n; i++){
dp[i] += dp[i - 1];
}
for (int i = 1; i < m; i++){
dp[0] += grid[i][0];
for (int j = 1; j < n; j++){
dp[j] = min(dp[j - 1] + grid[i][j], dp[j] + grid[i][j]);
}
}
return dp[n - 1];
}
};