题目:
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
题解:
首先我们用动态规划解决这个问题,求最小路径和,令dp[i][j]代表从(i,j)点走到(m-1,n-1)点的最小路径和。然后我们应该考虑的是如何求出dp[i][j],每次只能往右边走或者往下走,所以我们可以得知从(i,j)只能走到(i+1,j)或者(i,j+1),所以就是在dp[i][j+1],dp[i+1][j]两者间取最小即可。
式子为:dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
算法代码:
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
int min[][]=new int[m][n];
min[0][0]=grid[0][0];
//先固定列
for(int j=1;j<m;j++){
min[j][0]=min[j-1][0]+grid[j][0];
}
//再固定行
for(int i=1;i<n;i++){
min[0][i]=min[0][i-1]+grid[0][i];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
min[i][j]=Math.min(min[i-1][j]+grid[i][j],min[i][j-1]+grid[i][j]);
}
}
return min[m-1][n-1];
}