64:最小路径和

问题描述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 13111 的总和最小。

问题分析

没什么好说的,这种要用到过去的结果的题目,都用动态规划来做,这道题显然不能用贪心。

怎么做?首先我们进行初始化。第一行和第一列的路径只有一条,我们先对其进行初始化。
然后从剩余的元素开始递推,每个元素只接受左侧和上方的值较小的那个。

所以状态转移方程为: 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];
    }
}
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103651916