题目
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.
Example 1:
[[1,3,1],
[1,5,1],
[4,2,1]]
Given the above grid map, return 7. Because the path 1→3→1→1→1 minimizes the sum.
题意
给一个矩阵有每个位置上的权值,从左上角开始走,只能向右向下走,求最小带权路径
分析
dp[i][j]表示走到(i, j)上花费的最小权值,走到(i, j)上的前一步只能是(i-1, j)或者(i, j-1)
dp[i][j]=min(dp[i][j−1],dp[i−1][j])+grid[i][j]
降维方法:
dp[i][j] 的值依赖于他的上方和左方, 那么两层循环可以从上到下,从左到右计算,
那么对于计算dp[j]的时候,dp[j]的原始值即 dp[i-1][j], dp[j-1]即dp[i][j-1]的值(画个图就能理解了).所以状态转移优化为:
dp[j]=min(dp[j−1],dp[j])+grid[i][j];j!=0
dp[0]=dp[0]+grid[i][0];j==0
代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if (grid.size() == 0) return 0;
int m = grid.size(), n = grid[0].size();
vector<int> dp(n,99999);
dp[0] = 0;
for (int i = 0; i < m; i++) {
dp[0] = dp[0] + grid[i][0];
for (int j = 1; j < n; j++) {
dp[j] = min(dp[j-1], dp[j]) + grid[i][j];
}
}
return dp[n-1];
}
};