最小路径和
题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。提示:m == grid.lengthn == grid[i].length1 <= m, n <= 2000 <= grid[i][j] <= 100
示例
结果:7
class Solution {
public int minPathSum(int[][] grid) {
// 初始化
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
for(int i = 1 ; i<n ; i++){
dp[0][i] += dp[0][i-1]+grid[0][i];
}
for(int i = 1 ; i<m ; i++){
dp[i][0] += dp[i-1][0]+grid[i][0];
}
// 动态规划规程
for(int i = 1 ; i<m ; i++){
for(int j = 1 ; j<n ; j++){
dp[i][j] = (dp[i-1][j]>dp[i][j-1]?dp[i][j-1]:dp[i-1][j]) // 找到上面或者左边最小的值
+ grid[i][j];
}
}
return dp[m-1][n-1];
}
}
典型的动态规划题目,定义存储矩阵dp[i][j]为到当前位置的最小数值和。
其转移公式为:
dp[i][j] = min{dp[i-1][j] (上边路径和) , dp[i][j-1] (左边路径和)} + grid[i][j]