设dp[i][j]表示行数为i,列数为j的矩阵中,从左上角到右下角的最小路径和。状态公式:
- 当
i>=2 && j>=2时,dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1] - 基准1:
dp[1][k] = dp[1][k-1] + grid[0][k-1] - 基准2:
dp[k][1] = dp[k-1][1] + grid[k-1][1]
状态公式的解释如下:
- 如果行数和列数都大于2,那么当前点的最小路径和为
正上方节点最小路径和与正左方节点最小路径和中的较小者,加上当前节点的值 - 只有一行时,累加即可
- 只有一列时,同样累加即可
代码如下:
//
// Created by jt on 2020/8/30.
//
#include <vector>
using namespace std;
class Solution {
public:
/**
*
* @param grid int整型vector<vector<>>
* @return int整型
*/
int minPathSum(vector<vector<int> >& grid) {
// write code here
if (grid.size() < 1) return 0;
vector<vector<int> > dp(grid.size()+1, vector<int>(grid[0].size()+1, 0));
for (int i = 1; i <= grid.size(); ++i) { dp[i][1] = dp[i-1][1] + grid[i-1][0]; }
for (int i = 1; i <= grid[0].size(); ++i) { dp[1][i] = dp[1][i-1] + grid[0][i-1]; }
for (int i = 2; i <= grid.size(); ++i) {
for (int j = 2; j <= grid[0].size(); ++j) {
dp[i][j] = min(dp[i-1][j], dp[i][j-1])
+ grid[i-1][j-1]; // 别忘了加上当前值
}
}
return dp[grid.size()][grid[0].size()];
}
};
京公网安备 11010502036488号