0
点赞
收藏
分享

微信扫一扫

动态规划——最小路径和

栖桐 2022-02-03 阅读 181
  1. 最小路径和
    这是经典二维动态规划题目;
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

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

示例 1:

|1|2|3
|1|5|3
|4|2|1

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

输入:grid = [[1,2,3],[4,5,6]]
输出:12

class Solution {
    int[][] NUM;
    int[][] dp;
    public int minPathSum(int[][] grid) {
        int y=grid[0].length;    //3
        int x=grid.length;      //2
        NUM=grid;
        dp=new int[x][y];
        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                dp[i][j]=road(i,j); //1,2
            }
        }
        return dp[x-1][y-1];
    }

    public int road(int x,int y){       //x=1,y=2
        if(x==0&&y==0)  return NUM[0][0];
        if(x==0&&y!=0)  return dp[0][y-1]+NUM[0][y];
        if(x!=0&&y==0)  return dp[x-1][0]+NUM[x][0];
        if(x>0&&y>0){
            int t=min_1(dp[x-1][y],dp[x][y-1]);
            return t+NUM[x][y];
        }
        return 0;  
    }

    public int min_1(int x,int y){
        if(x>=y)    return y;
        return x;
    }
}

数组NUM:用于将grid提升为类内通用数组,避免在road函数中的传递;
数组dp:本题动态规划核心,负责记录从【0】【0】位置到达任意一点的最小路径和,分为四种情况:
1.当处于【0】【0】位置时,最小路径为其本身自身大小;
2.当处于【x】【0】位置时,最小路径来自于其楼上最小路径+其自身大小;
3.当处于【0】【y】位置时,最小路径来自于其左侧最小路径+其自身大小
4.其他情况时为左侧与楼上二者最小路径中较小者+其自身大小。

注意:辨别x,y的意义;x表示行数,y表示列数。

举报

相关推荐

0 条评论