64题-最小路径和
1.1题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
1.2解答
最简单的方法就是穷举法,将一种走法全部遍历出来,进一步我们可以想怎样聪明一点的遍历。因为你每到一个点的方式最多只有两种,就是左边和上边,也就是说只要记录上一步的最小值就可以知道下一步的最小值加上当前位置步数。这就是就是动态规划的转移方程。(我这里是新建一个dp数组,可以直接在原数组上进行修改)
1.3代码
package solution;
import java.util.Arrays;
/**
* @author xgj
*/
public class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
for(int i = 0 ;i < m ;++i){
for(int j = 0 ; j < n ;++j){
if(i == 0 && j == 0){
dp[i][j] = grid[i][j];
}else if(i == 0 && j != 0){
dp[i][j] = dp[i][j-1]+ grid[i][j];
}else if(i != 0 && j == 0){
dp[i][j] = dp[i-1][j]+ grid[i][j];
}else{
dp[i][j] = Math.min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
}
}
}
return dp[m-1][n-1];
}
}