问题描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
问题分析
没什么好说的,这种要用到过去的结果的题目,都用动态规划来做,这道题显然不能用贪心。
怎么做?首先我们进行初始化。第一行和第一列的路径只有一条,我们先对其进行初始化。
然后从剩余的元素开始递推,每个元素只接受左侧和上方的值较小的那个。
所以状态转移方程为: dp[i][j] += max(dp[i-1][j],dp[i][j-1])
AC代码:
package program;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
int[][] arr = {{1,3,1},{1,5,1},{4,2,1}};
Solution solution = new Solution();
System.out.println(solution.minPathSum(arr));
}
}
class Solution{
public int minPathSum(int[][] grid) {
if(grid.length == 0){
return 0;
}
else if(grid[0].length == 0){
return 0;
}
for(int i = 1; i < grid[0].length; i++){
grid[0][i] += grid[0][i-1];
}
for(int i = 1; i < grid.length; i++){
grid[i][0] += grid[i-1][0];
}
for(int i = 1; i < grid.length; i++){
for(int j = 1; j < grid[0].length; j++){
grid[i][j] += grid[i-1][j] > grid[i][j-1]?grid[i][j-1]:grid[i-1][j];
}
}
return grid[grid.length-1][grid[0].length-1];
}
}