【动态规划】路径问题 {二维动态规划;选择合适的状态表示方法;创建虚拟节点}

news2024/11/27 11:50:19

一、经验总结

选择合适的状态表示方法
一般的,状态表示的方法有两种:

  1. 以[i, j]位置为终点,正向填表;用之前的状态推导出dp[i][j]的值(从哪里来);
  2. 以[i, j]位置为起点,反向填表;用之后的状态推导出dp[i][j]的值(到哪里去);

创建虚拟节点

  • 一般虚拟节点设置在需要特殊处理的边界位置,在二维动态规划中,可以出现在矩阵的四边。
  • 需要根据题目要求设置虚拟节点的初始值,以确保后续填表的正确性。
  • 注意dp表与原始表的下标映射关系。

二、相关编程题

2.1 不同路径

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0)); //多开一行一列作为虚拟节点
        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.2 不同路径Ⅱ

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obs) {
        int m = obs.size(), n = obs[0].size();
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        dp[0][1] = 1;
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(obs[i-1][j-1] == 1) continue; //注意dp表与原矩阵下标的映射关系
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m][n];
    }
};

2.3 珠宝的最高价值

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int m = frame.size(), n = frame[0].size();
        vector<vector<int>> dp(m+1, vector<int>(n+1));
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                dp[i][j] = max(dp[i][j-1], dp[i-1][j])+frame[i-1][j-1];
            }
        }
        return dp[m][n];
    }
};

2.4 下降路径最小和

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> dp(n+1, vector<int>(n+2, INT_MAX)); //dp表多创建1行2列
        for(int j = 0; j < n+2; ++j) //将第一行(虚拟节点)初始化为0,两边的两列初始化为INT_MAX
        {
            dp[0][j] = 0;
        }
        auto min = [](int a, int b, int c)->int{
            int tmp = a<b? a:b;
            return c<tmp? c:tmp;
        };
        for(int i = 1; i <= n; ++i) //从上往下填表
        {
            for(int j = 1; j <= n; ++j)
            {
                dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+matrix[i-1][j-1];
            }
        }
        int ret = INT_MAX; //选出最后一行的最小值作为结果
        for(int j = 1; j <= n; ++j)
        {
            if(ret>dp[n][j])
            {
                ret = dp[n][j];
            }
        }
        return ret;
    }

};

2.5 最小路径和

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m+1, vector<int>(n+1, INT_MAX));
        dp[0][1] = dp[1][0] = 0;
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                dp[i][j] = grid[i-1][j-1] + min(dp[i-1][j], dp[i][j-1]);
            }
        }
        return dp[m][n];
    }
};

2.6 地下城游戏

题目链接

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

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

本题的难点在于怎么处理血量增加的问题, 增加血量不能为之前的损失提供帮助,只会对后续有帮助。
这意味着正向填表是困难的,但是反向填表很好做。以当前位置为起点,从后往前推,当前如果可以治愈,那么当前的最低血量就是下一关的最低血量减去治疗量,注意不可以<1。

编写代码

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dun) {
        int m = dun.size(), n = dun[0].size();
        vector<vector<int>> dp(m+1, vector<int>(n+1, INT_MAX));
        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] = min(dp[i+1][j], dp[i][j+1]) - dun[i][j];
                dp[i][j] = max(1, dp[i][j]);
            }
        }
        return dp[0][0];
    }
};

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

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

相关文章

Spring Boot组件化与参数校验

Spring Boot组件化与参数校验 Spring Boot版本选择 2.3.x版本 2.6.x版本 Spring Boot核心思想 约定大于配置&#xff0c;简化繁琐的配置 Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类&#xff0c;Spr…

详细分析Oracle日期和时间的基本命令

目录 1. 基本类型2. 常用函数3. Demo 1. 基本类型 Oracle支持不同的日期格式模型&#xff0c;其中包括&#xff1a; ISO 8601: YYYY-MM-DDTHH:MI:SS&#xff0c;例如2024-06-20T14:30:00Oracle内部格式: DD-MON-YYYY HH:MI:SS AM&#xff0c;例如20-JUN-2024 02:30:00 PM DA…

6月20日(周四)欧美股市总结:“三巫日”当前,标普开盘创新高后与纳指转跌,英伟达一度跳水8%,市值跌离最大

美国上周首次申请失业救济人数高于预期&#xff0c;新屋建造和费城制造业数据均显示经济放缓&#xff0c;市场维持对美联储年内降息两次的预期。标普盘初升破5500点创新高后下跌&#xff0c;纳指止步七日连创新高&#xff0c;但道指涨300点至四周新高。英伟达盘初涨3.8%至盘中最…

【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;初步了解 二叉搜索树 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀map与set &#x1f4d2;1.…

绿色领航·数链未来“2024中国消费电子博览会”招商工作全面启动

中国国际消费电子博览会&#xff08;简称CICE电博会&#xff09;自2001年创办以来&#xff0c;已逐渐发展成为全球极具影响力的行业盛会。它不仅是国内外消费电子产业的重要交流平台&#xff0c;更是展示我国消费电子产业发展成果的重要窗口。2024年&#xff0c;这一盛会再次在…

windows下前端开发环境安装

文章目录 windows下前端开发环境安装1. Cmder 终端使用1.1 cmder进入指定目录 2. nodejs环境安装3. vscode编辑器下载3.1 vscode插件离线安装 windows下前端开发环境安装 1. Cmder 终端使用 使用Cmder替换cmd&#xff0c;让开发更高效 https://cmder.net/ 打开网址后&#…

系统架构设计师 - 数据库系统(1)

数据库系统 数据库系统数据库模式 ★分布式数据库 ★★★数据库设计阶段 ★★ER模型 ★关系模型 ★ ★结构约束条件完整性约束 关系代数 ★ ★ ★ ★概述自然连接 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系统架构设计师 - 数据库系统(1)知识&#xff0c;希望内…

掌握心理学知识成为产品经理一门必修课?

文章目录 心理学与产品设计的关联关系产品经理需要学习哪些心理学知识产品心理学的学习对象包含哪些 谈及心理学&#xff0c;往往认为它是一门研究人类心理现象及其影响下的精神功能和行为活动的科学&#xff0c;很多情况下&#xff0c;我们的直观印象是把心理学与医学领域进行…

Hadoop三大组件原理详解:hdfs-yarn-MapReduce(第9天)

系列文章目录 一、HDFS读写原理【重点】 二、YARN提交mr流程【重点】 三、MapReduce计算流程【重点】 文章目录 系列文章目录前言一、HDFS读写原理[面试]1、HDFS数据写入解析2、HDFS数据读取解析 二、YARN提交mr流程[面试]1. YARN提交mr过程解析 三、MapReduce计算流程[面试]1…

RK3568技术笔记十四 Ubuntu创建共享文件夹

单击“虚拟机”&#xff0c;单击“设置”&#xff0c;如图所示&#xff1a; 单击“选项”&#xff0c;选择“总是启用&#xff08;E&#xff09;”&#xff0c;单击“添加”&#xff0c;如图所示&#xff1a; 单击“下一步”&#xff0c;如图所示&#xff1a; 单击“浏览”添加…

建筑幕墙设计乙级资质申请要点梳理

建筑幕墙设计乙级资质申请要点梳理如下&#xff1a; 一、申请条件 资历和信誉&#xff1a; 企业需具有独立企业法人资格&#xff0c;能够独立承担法律责任。社会信誉良好&#xff0c;无不良记录。注册资本不少于100万元人民币。技术条件&#xff1a; 专业配备齐全、合理&#…

苹果电脑如何清理磁盘空间 苹果电脑如何清理系统数据

你是否遇到过电脑磁盘空间不足的情况呢&#xff1f;Mac电脑有着流畅的操作系统&#xff0c;但是随着日常使用&#xff0c;可能电脑里的垃圾文件越来越多&#xff0c;导致磁盘空间不足&#xff0c;随之会出现电脑卡顿、软件闪退等情况。及时清理磁盘空间可以有效避免电脑这些问题…

java连接kerberos用户认证

文章目录 一、背景二、代码2.1目录2.2配置文件application.properties2.3pom依赖2.4代码AuthProviderConfig配置类CustomConfigurationByKeytab配置类CustomConfigurationByPassword配置类TestControllerMyCallbackHandlerDummyUserDetailsService实现类LdapTest2Application启…

AI播客下载:Possible(OpenAI投资人Reid Hoffman主持)

这是由 LinkedIn 创办人&#xff0c;同时也是 OpenAI 早期投资者 Reid Hoffman。节目上会邀请各领域的专家 (教育、医疗、司法)&#xff0c;探讨 AI 对世界的影响。这节目特别有趣的地方&#xff0c;是在 GPT-4 协助下制作的&#xff0c;开创了人机协作内容 。 如果未来一切都能…

Windows10任务栏卡顿解决方案

一、重新启动任务资源管理器 右键底部任务栏选择“任务管理器”&#xff1b;按快捷键“CtrlShiftEsc”&#xff1b;搜索框搜索“任务管理器”并单击“打开”&#xff1b;“WinX”打开开始菜单附属菜单&#xff0c;在列表中选择“任务管理器” &#xff1b;按下“ctrlaltdelete”…

Linux管道与重定向

管道 是进程通信的方法之一&#xff0c;在Linux中用命令1|命令2的形式表示&#xff0c;将前一个命令的结果作为后续命令的参数进行输入&#xff0c;也有tee管道&#xff0c;可以进行多次筛选&#xff0c;即多次使用|过滤命令。 重定向 文件描述符FD Linux中输入输出分为三种…

HTTP 抓包工具——Fiddler项目实战

网络爬虫实质上是模拟浏览器向 Web 服务器发送请求。对于一些简单的网络请求&#xff0c;我们 可以通过查看 URL 地址来构造请求&#xff0c;但对于一些稍复杂的网络请求&#xff0c;仍然通过观察 URL 地 址将无法构造正确。因此我们需要对这些复杂的网络请求进行捕获分…

高考填报志愿,性格决定命运

所谓性格决定命运&#xff0c;也即是强调了性格在左右我们的人生&#xff0c;性格会和个人的未来成就相挂钩&#xff0c;当一个人向来小心谨慎时&#xff0c;适合一些与数字打交道的工作&#xff0c;也可以从事一些比较细致点的工作&#xff0c;如果一个人向来大大咧咧&#xf…

【Linux命令入门】shell命令解析与PATH环境变量

文章目录 前言1.Linux shell 简介2. Linux命令提示符Linux命令的组成环境变量设置环境变量永久设置临时设置总结前言 Linux命令行(shell)是与操作系统交互的重要工具。通过学习和掌握基本的shell命令,用户可以高效地管理文件、执行程序和处理系统任务。PATH环境变量在Linux…

SpringBoot【3】集成 Swagger

SpringBoot 集成 Swagger 前言pom.xml 配置文件application.yml 配置文件config 包Swagger2Config entity 包UserEntity service 包impl 包SwaggerServiceImpl SwaggerService controller 包SwaggerController SwaggerApplication验证 前言 创建项目步骤、及版本选择等&#x…