【动态规划】路径问题:不同路径,珠宝的最高价值,下降路径最小和,最小路径和,地下城游戏

1. 不同路径 (LC62)

不同路径

题目描述

解题思路

  • 状态表示:dpij表示到(i,j)有dpij中路径
  • 状态转移方程:dp[i][j] = dp[i-1][j]+dp[i][j-1]
  • 初始化:i=0j=0 没有路径,dp[1][1]=1

代码实现

java 复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m+1][n+1];
        dp[1][1] = 1;
        for(int i = 1;i<=m;i++){
            for(int j = 1;j<=n;j++){
                if(i==1 && j == 1)
                    continue;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m][n];
    }
}

2. 不同路径 II(LC63)

不同路径II

题目描述

代码实现

java 复制代码
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m+1][n+1];
        dp[0][1] = 1;
        for(int i = 1;i<=m;i++){
            for(int j = 1;j<=n;j++){
                if(obstacleGrid[i-1][j-1]==0)
                    dp[i][j] = dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }
}

3. 珠宝的最高价值(LC166)

珠宝的最高价值

题目描述

代码实现

java 复制代码
class Solution {
    public int jewelleryValue(int[][] frame) {
        int m = frame.length;
        int n = frame[0].length;
        int[][] dp = new int[m+1][n+1];
        for(int i = 1;i<=m;i++){
            for(int j = 1;j<=n;j++){
                dp[i][j] = Math.max(frame[i-1][j-1]+dp[i-1][j],frame[i-1][j-1]+dp[i][j-1]);
            }
        }
        return dp[m][n];
    }
}

4. 下降路径最小和(LC931)

下降路径最小和

题目描述

解题思路

  • 状态表示:到达(i,j)最小路径和为dp[i][j]
  • 状态转移方程:dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]+matrix[i-1][j-1]
  • 初始化:
    1. 要在原数组的规模上 上方加上一行,两边各加一列,int[] dp = new int[n+1][n+2]
    2. 两边要初始化为无穷小,上方初始化为0。

代码实现

java 复制代码
class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix.length;
        int[][] dp = new int[n+1][n+2];
        for(int[] arr : dp)
            Arrays.fill(arr,Integer.MAX_VALUE);
        for(int i = 0;i<=n+1;i++)
            dp[0][i]=0;

        for(int i = 1;i<=n;i++){
            for(int j = 1;j<=n;j++){
                dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]))+matrix[i-1][j-1];
            }
        }
        int ret = Integer.MAX_VALUE;
        for(int i = 0;i<=n;i++)
            ret = Math.min(dp[n][i],ret);
        return ret;
    }
}

5. 最小路径和(LC64)

最小路径和

题目描述

解题思路

如果按照之前的思路,多加一行多加一列,初始化dp所有值都是0,直接用dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1]计算第一行和第一列,会直接把边界的0当做最小值,而之前填过的路径和永远比边界小。这种情况下应该先初始化第1行和第1列,而多加的一行0和一列0就没用了。可以初始化为无穷大

也可以直接创建相同规模的dp,初始化第一行第一列,再填表

代码实现

java 复制代码
class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];

        dp[0][0] = grid[0][0];
        
        //初始化第一行和第一列
        for(int i = 1;i<m;i++)
            dp[i][0] = dp[i-1][0]+grid[i][0];
        for(int j = 1;j<n;j++)
            dp[0][j] = dp[0][j-1]+grid[0][j];


        for(int i = 1;i<m;i++)
            for(int j = 1;j<n;j++)
                dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];
        return dp[m-1][n-1];
    }
}

6. 地下城游戏(LC174)

地下城游戏

题目描述

解题思路

  • 状态表示:(i,j)为起点到终点的最低生命值为dpij
  • 状态转移方程:dp[i][j] = Math.min(dp[i+1][j],dp[i][j+1]) - dungeon[i][j];找到右边和下边的最小值减去当前的数值。如果为负数,说明不需要额外的初始值就可以走到终点,直接置为1

代码实现

java 复制代码
class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length;
        int n = dungeon[0].length;
        int[][] dp = new int[m+1][n+1];

        for(int i = 0;i<=m;i++)
            dp[i][n] = Integer.MAX_VALUE;

        for(int j = 0;j<=n;j++)
            dp[m][j] = Integer.MAX_VALUE;

        dp[m-1][n] = dp[m][n-1] = 1;

        for(int i = m-1;i>=0;i--){
            for(int j = n-1;j>=0;j--){
                dp[i][j] = Math.min(dp[i+1][j],dp[i][j+1]) - dungeon[i][j];
                dp[i][j] = Math.max(dp[i][j],1);
            }
        }
        return dp[0][0];
    }
}
相关推荐
河南花仙子科技35 分钟前
花仙子科技干货分享|游戏制作技术演进历程与未来展望
科技·游戏
2601_957174651 小时前
大模型算法 简单 容易 用这个方法
算法
VALENIAN瓦伦尼安教学设备1 小时前
激光对中仪采购要点
数据库·嵌入式硬件·算法
Forever Nore3 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展
To_OC3 小时前
LC 3 无重复字符的最长子串:从入门滑动窗口到优化写法,再也不怕面试官追问
javascript·算法·leetcode
(Charon)4 小时前
【C++】多线程死锁:产生原因、复现与解决方法
开发语言·c++·算法
lucas_AI4 小时前
ConfBench:大模型的「我很有把握」,到底能不能信?
人工智能·算法
oier_Asad.Chen4 小时前
【洛谷题解/AcWing题解/真题】洛谷P2330【SCOI2005】繁忙的都市(Kruskal算法的再探究))
c++·算法·贪心算法·图论·最小生成树·kruskal
ownkss6 小时前
游戏公会联运怎么做:步骤、指标与复盘重点
游戏·游戏发行·游戏运营·游戏分发
xcLeigh6 小时前
Unity基础:C#脚本的创建与挂载——让你的游戏物体活起来
游戏·unity·c#·教程