题目
leetcode 64.最小路径和
//Dr.He,这竟然是滴滴面试题
思路
动态规划
状态转移方程的定义
dp[i][j]:从Start(左上角)到位置(i,j)(第i行第j列的元素)的最小路径和
状态转移方程
对于不同位置求法不同,具体分为以下4种情况:
i) (0,0),即终点就在Start位置时
dp[0][0] = grid[0][0]
ii)(I,0),即位于左边界时
当前位置最小路径和为上一行元素的最小路径和 + 当前路径值
dp[i][0] = dp[i - 1][0] + grid[i][0]
iii)(0,j),即位于上边界时
当前位置最小路径和为左一列元素的最小路径和 + 当前路径值
dp[0][j] = dp[0][j - 1] + grid[0][j]
iiii)(I,j)在中间,这是最普遍的情况
对于位置(i, j)的最小路径和
走到当前位置的最小路径和 = 从左边走过来的最小路径和和从上边走过来的最小路径和中更小的一方 + 当前路径值
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
AC代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> dp(m, vector<int> (n, 0));
dp[0][0] = grid[0][0];
for(int i = 1; i < m; i++)
dp[i][0] = dp[i - 1][0] + grid[i][0];
for(int j = 1; j < n; j++)
dp[0][j] = dp[0][j - 1] + grid[0][j];
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}
};