动态规划算法专题(二):路径问题

news2024/11/28 8:33:59

1. 不同路径

. - 力扣(LeetCode)

1.1 算法原理 

  • 状态表示dp[i][j]:走到(i,j)位置,一共有多少种方法(以(i,j)位置为结尾)
  • 状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1];
  • 初始化:dp[0][1]=1;
  • 建表顺序:从上往下的每一行填表,每一行中从左往右。
  • 返回值:dp[m][n]

1.2 算法代码

class Solution {
    //1.创建dp表
    //2.初始化
    //3.填表顺序
    //4.返回值
    public int uniquePaths(int m, int n) {
        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++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m][n];
    }
}

2. 不同路径 II

. - 力扣(LeetCode)

2.1 算法原理

本题算法思想和上题基本一致,但需额外注意以下几点:

  1. dp填表时,需要注意当前位置(i,j)是否存在障碍物,若存在障碍物则dp[i][j]=0;
  2. 初始化后,虚拟节点值的设置与上题相同。但,由于本题是数组形式,所以需要额外注意原数组与dp表的下标映射关系。

2.2 算法代码

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        //以(i,j)位置为终点,到达(i,j)位置的路径总数
        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] != 1) 
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m][n];
    }
}

3. 珠宝的最高价值

. - 力扣(LeetCode)

3.1 算法原理 

  • dp[i][j]状态表示:到达(i,j)位置,能得到的最高价值(以(i,j)位置为结尾)
  • 状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + arr[i - 1][j - 1];
  • 初始化:  dp=new int[m+1][n+1];
  • 虚拟节点值为0(不影响后续填表)
  • 下标映射  dp(i,j)-->arr(i-1,j-1)
  • 返回值:dp[m][n]

 3.2 算法代码

class Solution {
    public int jewelleryValue(int[][] frame) {
        //dp[i][j]:以(i,j)位置为结尾,到达(i,j)位置得到的最高价值数
        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++) {
                //根据最近的一步划分问题 --> 状态转移方程
                int val = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];
                dp[i][j] = val;
            }
        }
        return dp[m][n];
    }
}

4. 下降路径最小和

. - 力扣(LeetCode)

4.1 算法原理 

  • 状态表示dp[i][j]:达到(i,j)位置,最小下降路径(以(i,j)位置为结尾)
  • 状态转移方程:dp[i][j]=min(dp[左斜上],dp[正上],dp[右斜上])+arr[i-1][j-1];
  • 初始化:dp表,多创建一行,多创建两列。
  • 虚拟节点的初始值要保证后续填表的正确性:第一行 -> 0; 第一列、最后一列 -> MAX_V
  • 下标映射
  • 建表顺序:从上往下
  • 返回值:dp表中最后一行的最小值

4.2 算法代码

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix.length;
        int[][] dp = new int[n + 1][n + 2];
        for(int i = 0; i < n + 1; i++) Arrays.fill(dp[i], Integer.MAX_VALUE);
        //初始化
        for(int i = 0; i < n + 2; i++) dp[0][i] = 0;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                int x1 = Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]);
                dp[i][j] = x1 + matrix[i - 1][j - 1];
            }
        }
        int ret = Integer.MAX_VALUE;
        for(int i = 1; i <= n; i++) ret = Math.min(ret, dp[n][i]);
        return ret;
    }
}

5. 最小路径和

. - 力扣(LeetCode)

5.2 算法原理

  • 状态表示dp[i][j]:从起点开始,到达(i,j)位置的最小路径和(以(i,j)位置为结尾)
  • 状态转移方程:dp[i][j]=min(dp[i-1][j], dp[i][j-1])+arr[i-1][j-1];
  • 建表顺序:从上往下,从左往右

 5.3 算法代码

class Solution {
    public int minPathSum(int[][] grid) {
        //1. 建dp表
        //2. 初始化
        //3. 填表顺序
        //4. 返回值
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m + 1][n + 1];
        //初始化
        for(int i = 0; i <= m; i++) Arrays.fill(dp[i], Integer.MAX_VALUE);
        dp[1][0] = 0; dp[0][1] = 0;
        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 - 1][j - 1];
            }
        }
        return dp[m][n];
    }
}

6. 地下城游戏

. - 力扣(LeetCode)

6.1 算法原理

状态表示dp[i][j]:

  1.  以(i,j)位置为结尾,到达(i,j)位置所需的最低生命值(dp[i][j]的值与后面路径的dp值有关,故该方法不可行)
  2. 以(i,j)位置为起点,到达终点所需的最低生命值(可行)

状态转移方程:

  1. dp[i][j]=min(dp[i+1][j], dp[i][j+1]) - arr[i][j];(从(i,j)位置走出时的生命值,要大于等于进入下一位置所需的生命值,x+arr[i][j]>=dp[i+1][j](或者x+arr[i][j]>=dp[i][j+1]) --> x>=dp[i+1][j]-arr[i][j])
  2. dp[i][j] = max(1, dp[i][j]);//本位置能够增加的生命值过多,导致计算出的值为负数,此时初始生命值可以为1

6.2 算法代码

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length, 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;
        //骑士拯救公主后生命值最少为1
        dp[m][n - 1] = dp[m - 1][n] = 1;
        for(int i = m - 1; i >= 0; i--) {
            for(int j = n - 1; j >= 0; j--) {
                int x = Math.min(dp[i + 1][j], dp[i][j + 1]);
                //当dungeon[i][j]为过大正数时,x - dungeon[i][j]计算得到的是负数
                //此时骑士的初始值可以为1
                dp[i][j] = Math.max(1, x - dungeon[i][j]);
            }
        } 
        return dp[0][0];
    }
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM超市进销存管理系统源码

主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录、进货管理、商品信息、类别管理、库存管理、销售管理、 客户信息管理、供应商管理、员工管理、修改管理员个人信息等功能。 员工角色包含以下功能&#xff1a;员工登录、进货信息查看、退货信息管理…

大华智慧园区综合管理平台系统存在多处漏洞

漏洞描述 大华智慧园区综合管理平台是一个集智能化、信息化、网络化、安全化为一体的智慧园区管理平台&#xff0c;旨在为园区提供一站式解决方案&#xff0c;包括安防、能源管理、环境监测、人员管理、停车管理等多个方面。 FOFA app"dahua-智慧园区综合管理平台"…

【Linux庖丁解牛】—Linux基本指令(中)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…

【AIGC】ChatGPT账号的常见封号原因与解封方法

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;ChatGPT封号背景与常见原因ChatGPT封号行动背景ChatGPT常见的封号原因 &#x1f4af;OpenAl封号规则总结&#x1f4af;使用ChatGPT时防止封禁需要特别注意的细节和建议&a…

2025年数字人直播还能做吗?数字人直播的套路骗局须知网

2025年数字人直播还能做吗&#xff1f;数字人直播的套路骗局须知网 数字人直播是利用先进的数字技术和算法&#xff0c;创建出了一个具有人类形象的虚拟数字人&#xff0c;那通过模仿人类的行为、语言和情感进行事实的互动和内容的展示。 这种直播方式突破了传统的限制&#…

性能测试笔记1

为什么要进行性能测试&#xff1f;&#xff08;在真实项目商用时&#xff0c;需要大量的用户进行使用&#xff0c;因此需要模拟大量用户的使用场景 &#xff09; 1、业务需求 电商双 11 活动 / 微信春晚抢红包 /12306 春运订票 当前服务器配置是否支持 20000 人同时使用 技术…

深度学习中的结构化概率模型 - 使用图来描述模型结构篇

序言 在深度学习的探索之路上&#xff0c;结构化概率模型以其独特的视角和强大的表达能力&#xff0c;成为了研究复杂数据关系的重要工具。这一模型的核心在于其巧妙地利用图来描述模型结构&#xff0c;将随机变量间的复杂交互关系可视化、结构化。图的引入&#xff0c;不仅为…

【笔记】原子结构的近代理论

近代原子结构理论的建立是从氢原子光谱得到启示的。 一、氢原子光谱与波尔理论 1.氢原子光谱 在装有两个电极的真空玻璃管内通入极少量高纯氢气&#xff0c;通高压电使之放电&#xff0c;管中发出的光束通过分光棱镜&#xff0c;得到分立的谱线&#xff0c;称为线状光谱。 发…

系统安全 - Linux /Docker 安全模型及实践

文章目录 导图Linux安全Linux 安全模型用户层权限管理的细节多用户环境中的权限管理文件权限与目录权限 最小权限原则的应用Linux 系统中的认证、授权和审计机制认证机制授权机制审计机制 小结 内网安全Docker安全1. Docker 服务隔离机制Namespace 机制Capabilities 机制CGroup…

B 私域模式升级:开源技术助力传统经销体系转型

一、引言 1.1 研究背景 随着市场竞争加剧&#xff0c;传统经销代理体系面临挑战。同时&#xff0c;开源技术发展迅速&#xff0c;为 B 私域升级带来新机遇。在当今数字化时代&#xff0c;企业面临着日益激烈的市场竞争。传统的经销代理体系由于管理效率低下、渠道局限、库存压…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)

1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k&#xff0c;k&#xff1b;map是k&#xff0c;v&#xff09;&#xff0c;现在直接用T代替 template<class T> //这里直接传了T作为模板参数&#xff0c;T可能是pai…

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…

五子棋双人对战项目(5)——对战模块

目录 一、需求分析 二、约定前后端交互接口 三、实现游戏房间页面&#xff08;前端代码&#xff09; game_room.html game_room.css srcipt.js 四、实现后端代码 GameAPI Room Mapper 五、线程安全问题 一、需求分析 在对局中&#xff0c;玩家需要知道实时对局情况&…

高阶数据结构-------图

文章目录 图图的基本概念图的存储结构邻接矩阵邻接表 图的遍历广度优先遍历深度优先遍历 最小生成树Kruskal算法Prim算法 最短路径单源最短路径-Dijkstra算法单源最短路径-Bellman-Ford算法多源最短路径-Floyd-Warshall算法 图 图的基本概念 图的基本概念 图是由顶点集合和边的…

【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充

序言&#xff1a; 本文详细讲解了关于ArkTs语言中的泛型&#xff0c;其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法&#xff0c;补充了一部分接口相关的知识&#xff0c;包括接口的继承和具体实现&#xff0c;也写到了一些边边角角的小知识&#xff0c;剩…

【Linux】进程替换、命令行参数及环境变量(超详解)

目录 进程替换 替换函数的含义 命令行参数 环境变量 PATH 进程替换 我们先看代码&#xff1a; 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 printf("process...begin!\n");6 7 execl("/usr/bin/ls","ls"…

前端面试如何说解vue项目性能优化,你确定不来看看吗?

文末有福利 面试时&#xff0c;很经常会说对某某项目进行了性能优化&#xff0c;使性能有很大的提高之类的话。如果面试官问&#xff0c;来讲讲做了那些优化&#xff0c;这时候你就要很清晰地把你做过的优化一一说出来。 本文谨以自己的Vue项目经验来教你怎么在面试中说优化&am…

【算法与图】通向高效解决方案的钥匙

文章目录 遍历算法BFS&#xff08;广度优先遍历&#xff09;1. 什么是 BFS&#xff1f;2. 特点和应用3. BFS 示例 DFS&#xff08;深度优先搜索&#xff09;1. 什么是 DFS&#xff1f;2. DFS 的基本步骤3. 特点4. DFS 的应用5. DFS 示例 最小生成树问题1. 什么是最小生成树&…

【算法笔记】双指针算法深度剖析

【算法笔记】双指针算法深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】双指针算法深度剖析前言一.移动零1.1题目1.2思路分析1.3代码实现二.复写零2.1题目2.2思路分析2.3代码实现 三.快乐数3.1题目3…

微服务实战——ElasticSearch(保存)

商品上架——ElasticSearch&#xff08;保存&#xff09; 0.商城架构图 1.商品Mapping 分析&#xff1a;商品上架在 es 中是存 sku 还是 spu &#xff1f; 检索的时候输入名字&#xff0c;是需要按照 sku 的 title 进行全文检索的检索使用商品规格&#xff0c;规格是 spu 的…