【动态规划】路径问题|不同路径I|不同路径II|珠宝的最高价值|下降路径的最小和|最小路径和|

news2025/1/12 13:10:59

一、不同路径I

62. 不同路径 - 力扣(LeetCode)

 💡细节:

1.多开一行和一列(跟一维数组多开一个位置一样),这样方便初始化

2.状态转移方程:注意走一步并不是多一种走的路径,从i-1,j这个位置向下到i,j这个位置走一步,得出dp[i][j]为原来dp[i-1][j]条路径,而不是+1

3.初始化的时候得保证后面的结果是正确的:dp[0][1]=1或者dp[1][0]=1

代码: 

class Solution {
    public int uniquePaths(int m, int n) {
        //细节1.多开一个行和一列:方便初始化
        int[][] dp = new int[m+1][n+1];//dp[i][j]:到i,j位置有多少条路径
        dp[0][1] = 1;//或者dp[1][0]=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];
    }
}

 二、不同路径II

63. 不同路径 II - 力扣(LeetCode)

 💡 细节:没有障碍物就正常相加,有障碍物那么dp[i][j]就为0,就不用管了

class Solution {
    public int uniquePathsWithObstacles(int[][] ob) {
        int m = ob.length;
        int n = ob[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 (ob[i-1][j-1]==0) {//没有障碍物就正常相加,有障碍物那么dp[i][j]就为0不用管
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        
        return dp[m][n]; 
    }
}

三、珠宝的最高价值

LCR 166. 珠宝的最高价值 - 力扣(LeetCode)

 💡细节:注意下标的映射即可 

class Solution {
    public int jewelleryValue(int[][] frame) {
        int m = frame.length;
        int n = frame[0].length;
        int[][] dp = new int[m+1][n+1];//到达i,j位置拿到的珠宝价值

        //初始化都为0即可

        for(int i=1;i<=m;i++) {
            for(int j=1;j<=n;j++) {
                dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])+frame[i-1][j-1];//注意下标的映射
            }
        }

        return dp[m][n];

    }
}

四、下降路径的最小和

931. 下降路径最小和 - 力扣(LeetCode)

 💡细节: 1.因为涉及了j+1,所以要多开两列

                  2.初始化注意:不能全部初始化为0,eg:在紫色2,1的位置,如果全为0,那么此位置的最小路径可能不正确

                  3.返回值不是一个位置的值,而是最后一行的最小值

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int m = matrix.length;

        int[][] dp =new int[m+1][m+2];//多开一行,多开两列

        //初始化:全部初始化为正无穷,然后第m一行为0
        for (int i = 1; i < m+1; i++) {
            dp[i][0] = dp[i][m+1] = Integer.MAX_VALUE;
            
        }

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

        int min = Integer.MAX_VALUE;
        //返回值为最后一个的最小值
        for (int i = 1; i < m+1; i++) {
            min = Math.min(dp[m][i],min);
        }
        return min;
    }
}

 五、最小路径和

64. 最小路径和 - 力扣(LeetCode)

💡细节:初始化dp[0][1]和dp[1][0]为0,其余位置为正无穷即可 

总结:扩展初始化的时候,一般找找min就全部设置为正无穷,找max就全部设置为负无穷,其他位置再来特别考虑

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

        int[][] dp = new int[m+1][n+1];

        //初始化:扩展的部分全部初始化为正无穷,只有两个位置为0
        for(int i=0;i<=n;i++)  dp[0][i]=Integer.MAX_VALUE;
        for(int i=0;i<=m;i++)  dp[i][0]=Integer.MAX_VALUE;
        dp[0][1] = dp[1][0] = 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];
    }
}

六、地下城游戏

174. 地下城游戏 - 力扣(LeetCode)

 

 

💡细节:1.dp表示不能像上面一样表示,因为以i,j位置为终点,每次都要重新确认最小健康证,所以不对就换成:从i,j这个位置到终点的最低的健康点数

 2.初始化:这个拓展是在右下扩展,因为状态表示方程有j+1和i+1,初始化的时候都设置为正无穷,除了dp[m][n-1]和dp[m-1][n]为1,保证结果的正确性

3.状态表示:当前位置的健康值+dp当前位置  必须要大于等于 下一个位置的dp值

4.当dp[i][j]为负数的时候,根据dp表示的涵义,这个位置根本到不了,只能设置为1

class Solution {
    //得保证最后的健康值为负的最大
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length;
        int n = dungeon[0].length;

        int[][] dp = new int[m+1][n+1];//dp[i][j]:从这个位置到终点所需的最低健康点数

        //初始化:拓展的位置全部初始化为正无穷,只有dp[m][n-1]和dp[m-1][n]为1
        for(int i=0;i<=n-1;i++) dp[m][i]=Integer.MAX_VALUE;
        for(int i=0;i<=m-1;i++) dp[i][n]=Integer.MAX_VALUE;
        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--) 
            {
                dp[i][j] = Math.min(dp[i][j+1],dp[i+1][j])-dungeon[i][j];
                dp[i][j] = Math.max(1,dp[i][j]);
            }
                
        }
        return dp[0][0];
    }
}

 

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

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

相关文章

在编程的世界里,我相信每一行代码都是一次对未来的投资

&#x1f600;前言 突然有感而发也是激励自己互勉 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 在编程的世界里&#xff0c;我相信每一行代码都是一次对未来的投资类似句子编程的本质代码的价值构建可持续的未来结语 在编程的世界里&#xff0c;我相信每一行代码都是一…

数据库基础--MySQL多表查询之外键约束

MySQL多表关系 一对一 顾名思义即一个对应一个的关系&#xff0c;例如身份证号对于每个人来说都是唯一的&#xff0c;即个人信息表与身份证号信息表是一对一的关系。车辆信息表与车牌信息表也是属于一对一的关系。 一对多 即一个表当中的一个字段信息&#xff0c;对应另一张…

【数据库原理及应用】期末复习汇总高校期末真题试卷02

试卷 一、填空题 数据库系统是指计算机系统中引入数据库后的系统&#xff0c;一般由数据库、________、应用系统、数据库管理员和用户构成。当数据库的存储结构发生了改变&#xff0c;由数据库管理员对________映象作相应改变&#xff0c;可以使________保持不变&#xff0c;…

vue快速入门(五十一)历史模式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 历史模式配置方法 默认哈希模式&#xff0c;历史模式与哈希模式在表层的区别是是否有/#/ 其他差异暂不深究 源码 //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import m…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

华为eNSP小型园区网络配置(上)

→跟着大佬学习的b站直通车← 目标1&#xff1a;dhcp分配ip地址 目标2&#xff1a;内网用户访问www.yzy.com sw1 # vlan batch 10 # interface Ethernet0/0/1port link-type accessport default vlan 10 # interface Ethernet0/0/2port link-type trunkport trunk allow-pass…

oracle pl/sql 如何让sql windows 显示行号

oracle pl/sql 如何让sql windows 显示行号 下载最新版的pl/sql第一步&#xff0c;在preferences中对sql Windows进行设置&#xff0c;如下所示第二步&#xff0c;在preferences中对User interface进行设置&#xff0c;如下所示结果如下当然&#xff0c;还可以通过右键选择是否…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

【大模型学习】私有大模型部署(基础知识)

私有大模型 优点 保护内部隐私 缺点 成本昂贵 难以共享 难以更新 大模型底座 基础知识点 知识库 知识库是什么&#xff1f; 知识库的作用是什么&#xff1f; 微调 增强大模型的推理能力 AI Agent 代理&#xff0c;与内部大模型进行交互 开源 and 闭源 是否可以查…

二叉树的实现(详解,数据结构)

目录 一&#xff0c;二叉树需要实现的功能 二&#xff0c;下面是各功能详解 0.思想&#xff1a; 1.创建二叉树结点&#xff1a; 2.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 3.二叉树销毁&#xff1a; 4.前序遍历&#xff1a; 5.中序遍历&#xff1a;…

QT5之布局操作

目录 实验之前的前提 局部布局和整体布局定义 快捷工具 水平和垂直布局 水平布局 在对象区域可以看出三个已经被水平布局在一起 在对象区域选中布局&#xff0c;点击工具取消当前布局 可以将两个小局部进行大局部布局 网格布局 弹簧布局 分割器布局 器件对齐边距 也…

Java Map集合(一)

1. Map接口 1.1 Map接口概述 Map接口是一种双列集合。Map的每个元素都包含一个键对象Key和一个值对象Value &#xff0c;键对象和值对象之间存在对应关系&#xff0c;这种关系称为映射&#xff08;Mapping&#xff09;。 Map接口中的元素&#xff0c;可以通过 key 找到 value&…

STD10A230XCB电源模块STD05A230XCB整流模块介绍

STD10A230XCB电源模块STD05A230XCB整流模块介绍&#xff0c;直流屏电源模块STD05A230XCB&#xff0c;整流模块STD10A115XCB&#xff0c;STD20A115XCB&#xff0c;STD10A230X&#xff0c;STD05A230X&#xff0c;直流屏充电模块的关键词: 电力智能高频开关充电模块STD20A230XCB,高…

这是一个简单的照明材料网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>爱德照明网站首页</title><style>/*外部样式*/charset "utf-8";*{margin: 0;padding: 0;box-sizing: border-box;}a{text-dec…

Golang Colly爬取图片gorm存储数据

语言:Golang 库:Iris/Colly/gorm 运行结果 text/html; charset=utf-8 It is image 20240429222029_0_0.jpg Saved file: images\20240429222029_0_0.jpg text/html; charset=utf-8 It is image 20240429222030_1_0.jpg Saved file: images\20240429222030_1_0.jpg It is ima…

遭遇“U盘只剩USBC乱码”危机?这里有你需要的解决方案!

当你满心期待地将U盘插入电脑&#xff0c;准备读取或传输文件时&#xff0c;突然发现U盘中的文件名全部变成了乱码&#xff0c;尤其是当这些乱码以“USBC”开头时&#xff0c;你可能会感到惊慌失措。这种情况不仅影响你的工作效率&#xff0c;还可能导致重要数据的丢失。那么&a…

一键解决!Microsoft VB/VC 微软常用运行库全版本整合包组件可选 v240329

01 软件介绍 众多程序的正常运行&#xff0c;依赖于微软的运行库。而运行库包括多种类型&#xff0c;如VB&#xff08;Visual Basic&#xff09;和VC&#xff08;Visual C&#xff09;&#xff0c;并且涵盖了不同的版本。鉴于此&#xff0c;整合版的运行库合集提供了一种高效的…

修改 Windows 服务器远程端口,以阿里云服务器 ECS 为例

一、WinR - mstsc.exe 登录远程服务器 二、WinR - regedit.exe 打开注册表 三、打开注册表 tcp 路径&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp 双击右侧 PortNumber 子健&#xff0c;勾选十进制&a…

每日一题(AL001):A+B Format--字符串处理

找输出的顺序很重要&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int a,b;cin>>a>>b;int sumab;if(sum0) cout<<0;bool ftrue;vector<char> v;if(sum<0) {ffalse; sum-sum;}while(sum>0){char cstatic_cast<c…

知识图谱推动条件

文章目录 计算设备及硬件的发展可用数据规模的提升算法演进数据/知识检索需求攀升开源知识库建设专业人才培养 计算设备及硬件的发展 知识图谱的发展离不开计算硬件的支撑&#xff0c;特别是知识图谱构建、推理、应用过程中的机器学习算法的训练和预测等过程&#xff0c;对计算…