|
题目描述
给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。
示例1
输入:[[1,2],[5,6],[1,1]]
输出:8
分析:(by 时光若止~Dale)
动态规划
状态:
子状态:从(0,0)到达(1,0),(1,1),(2,1),...(m-1,n-1)的最短路径
F(i,j): 从(0,0)到达F(i,j)的最短路径
状态递推:
F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j)
初始化:
F(0,0) = (0,0)
特殊情况:第0行和第0列
F(0,i) = F(0,i-1) + (0,i)
F(i,0) = F(i-1,0) + (i,0)
返回结果:
F(m-1,n-1)
代码:
import java.util.*;
public class Solution {
/**
*
* @param grid int整型二维数组
* @return int整型
*/
public int minPathSum (int[][] grid) {
// write code here
int m=grid.length;
int n=grid[0].length;
if(m==0 && n==0){
return 0;
}
for(int i=1;i<m;i++){
grid[i][0]=grid[i-1][0]+grid[i][0];
}
for(int j=1;j<n;j++){
grid[0][j]=grid[0][j-1] +grid[0][j];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j]=Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];
}
}
return grid[m-1][n-1];
}
}
|
|