当前位置: 首页 > news >正文

《算法题讲解指南:动态规划算法--路径问题》--7.礼物的最大价值,8.下降路径最小和

🔥小叶-duck:个人主页

❄️个人专栏:《Data-Structure-Learning》《C++入门到进阶&自我学习过程记录》
《算法题讲解指南》--优选算法
《算法题讲解指南》--递归、搜索与回溯算法
《算法题讲解指南》--动态规划算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

7.礼物的最大价值

题目链接:

题目描述:

题目示例:

解法(动态规划):

算法思路:

C++算法代码:

算法总结及流程解析:

8.下降路径最小和

题目链接:

题目描述:

题目示例:

C++算法代码:

算法总结及流程解析:

结束语


7.礼物的最大价值

题目链接:

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

题目描述:

题目示例:

解法(动态规划):

算法思路:

1.状态表示:
对于这种「路径类」的问题,我们的状态表示一般有两种形式:
i.从[i,j]位置出发,巴拉巴拉;
ii.从起始位置出发,到达[i,j]位置,巴拉巴拉。
这里选择第二种定义状态表示的方式:
dp[i][j]表示:走到[i,j]位置处,此时的最大价值。

2.状态转移方程:
对于 dp[i][j],我们发现想要到达[i,j]位置,有两种方式:
i.从[i,j]位置的上方[i - 1,j]位置,向下走一步,此时到达[i,j]位置能拿到的礼物价值为dp[i-1][j]+grid[i][j];
ii. 从[i,j]位置的左边[i,j-1]位置,向右走一步,此时到达[i,j]位置能拿到的礼物价值为 dp[i][j-1]+grid[i][j]
我们要的是最大值,因此状态转移方程为:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]。

3.初始化:
可以在最前面加上一个「辅助结点」,帮助我们初始化。使用这种技巧要注意两个点:
i.辅助结点里面的值要「保证后续填表是正确的」;
ii.「下标的映射关系」。
在本题中,「添加一行」,并且「添加一列」后,所有的值都为即可。

4.填表顺序:
根据「状态转移方程」,填表的顺序是「从上往下填写每一行」,「每一行从左往右」。

5.返回值::
根据「状态表示」,我们应该返回dp[m][n]的值。

C++算法代码:

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

算法总结及流程解析:

8.下降路径最小和

题目链接:

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

题目描述:

题目示例:

解法(动态规划):

算法思路:

关于这一类题,由于我们做过类似的,因此「状态表示」以及「状态转移」是比较容易分析出的。比较难的地方可能就是对于「边界条件」的处理。

1.状态表示:
对于这种「路径类」的问题,我们的状态表示一般有两种形式:
i.从[i,j]位置出发,到达目标位置有多少种方式;
ii.从起始位置出发,到达[i,j]位置,一共有多少种方式
这里选择第二种定义状态表示的方式:
dp[i][j]表示:到达[i,j]位置时,所有下降路径中的最小和。

2.状态转移方程:
对于普遍位置[i,j],根据题意得,到达[i,j]位置可能有三种情况:
i. 从正上方[i- 1,j]位置转移到[i,j]位置;
ii.从左上方[i- 1,j -1]位置转移到[i,j]位置;
iii.从右上方[i -1,j+ 1] 位置转移到[i,j]位置;
我们要的是三种情况下的「最小值」,然后再加上矩阵在[i,j]位置的值。于是dp[i][j] = min(dp[i -1][j], min(dp[i - 1][j - 1], dp[i - 1][j +1])) + matrix[i][j] 。

3.初始化:
可以在最前面加上一个「辅助结点」,帮助我们初始化。使用这种技巧要注意两个点:
i.辅助结点里面的值要「保证后续填表是正确的」;
ii.「下标的映射关系」。
在本题中,需要「加上一行」,并且「加上两列」。所有的位置都初始化为无穷大,然后将第一行初始化为 0 即可。

4.填表顺序:
根据「状态表示」,填表的顺序是「从上往下」。

5.返回值:
注意这里不是返回 dp[m][n]的值!
题目要求「只要到达最后一行」就行了,因此这里应该返回「dp 表中最后一行的最小值」。

C++算法代码:

class Solution { public: int minFallingPathSum(vector<vector<int>>& matrix) { //1、创建 dp 表 //2、初始化 //3、填表 //4、返回值 int m = matrix.size(); int n = matrix[0].size(); vector<vector<int>> dp(m + 1, vector<int>(n + 2, INT_MAX)); //dp所有值初始化为INT_MAX是为了保证两边的边界值不会影响dp有效位置的结果 //dp的第一行初始化成0 for(int j = 0; j < n + 2; j++) { dp[0][j] = 0; } for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i - 1][j - 1]; } } //判断dp最后一行所有数据的最小值 int ret = INT_MAX;//避免ret本身值影响最终结果,需避免取到ret,则初始化成最大值 for(int j = 0; j < n + 2; j++) { ret = min(ret, dp[m][j]); } return ret; } };

算法总结及流程解析:

结束语

到此,7.礼物的最大价值,8.下降路径最小和 这两道算法题就讲解完了。礼物的最大价值,通过定义dp[i][j]表示到达(i,j)位置的最大价值,状态转移方程为dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j],采用辅助结点技巧初始化并填表;下降路径最小和,定义dp[i][j]为到达(i,j)位置的最小和,状态转移考虑上方、左上方和右上方三个来源的最小值,同样使用辅助结点处理边界条件。希望大家能有所收获!

http://www.jsqmd.com/news/512030/

相关文章:

  • macOS极简体验OpenClaw:GLM-4.7-Flash云端镜像快速试用
  • SEO_10个提升网站排名的SEO核心技巧与实战方法(230 )
  • 2026年佛山十大品牌核心产品有哪些盘点,靠谱门窗选购攻略来啦 - 工业品网
  • 毕设精品-基于 Python + 通义千问 API 的多模态数据清洗自动化系统
  • 基于SpringBoot+Vue的健康医院门诊在线挂号系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 西门子S7 - 200模拟器bet2.5e:无PLC也能畅快测试程序
  • 基于微信平台的“快一点”外送系统的设计与实现
  • 数据库知识点梳理(一):从基础操作到底层原理
  • Windows server2012R2 网络负载平衡(NLB)2026最新版(超详细)!!!
  • Elsevier Tracker:告别投稿焦虑,让科研进度一目了然的智能追踪神器
  • Qwen-Image-Edit-F2P与SpringBoot集成:构建人脸生成图像的Web应用
  • 最新微信在线AI客服系统源码独家支持多媒体+人工客服转接
  • 交流过零分断原理与电弧抑制电路设计
  • 天梯赛L2题解(013-016)
  • 模型部署需要考虑的性能指标和模型部署的步骤
  • 轻松制作燃料型原油蒸馏工艺流程图超便捷
  • 数据库课程设计实战:构建一个基于Youtu-Parsing的学术文献管理系统
  • 小天才海外版 imoo 发布二合一硬件,具备实时翻译功能;Streamo:让大模型变成实时流式交互助手丨日报
  • 上银导轨生产厂家哪家好?2026年评测结果出炉,市面上技术好的上银导轨哪家好甄选实力品牌 - 品牌推荐师
  • Mirage Flow与STM32CubeMX集成开发:自动化代码生成与模型调用
  • LiveGBS流媒体平台GB/T28181支持国标2022-操作日志页面如何筛选上级平台的调用记录直播观看录像回看等操作信息
  • 双向链表:从结构到增删改查
  • Vue3项目里用monaco-editor做个在线代码编辑器(带复制重置功能)
  • TIM+PWM输出+输入捕获测 频率+占空比(HAL库)
  • SEO_掌握这几个SEO技巧,让你的流量快速增长
  • Python信贷冷启动信用风险评估:WOE编码、IV筛选、代价敏感学习与逻辑回归稀疏样本建模 | 附代码数据
  • 别再手动复制了!用Vxe-Table的exportData方法,5分钟搞定Vue项目表格数据导出(含PDF/XLSX避坑指南)
  • 9.9元包月,告别Token焦虑,零配置,7×24 在线,火山引擎 ArkClaw “云端OpenClaw”龙虾私人助理,支持ClawHub技能插件
  • 【Rust面试问题】所有权机制
  • 黑丝空姐-造相Z-Turbo实战体验:输入文字秒出图片,效果惊艳