备战蓝桥杯Day36 - 动态规划 - 三角形最小路径和问题

一、什么是动态规划

通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推的方式解决。

哪些问题可以使用动态规划?

1、具有最优子结构:问题的最优解所包含的子结构的解也是最优的

2、具有无后效性:未来与过去无关,只与当前状态有关。

二、题目

三、思路分析 

1、规整数据

将数组规整一下,将多余的空格删除,使之变成我们熟悉且好操作的常规形状。

[
    [2],
    [3, 4],
    [6, 5, 7],
    [4, 1, 8, 3]
]

变成这样后方便我们观察规律也比较好写算法,如果有题目要求输出题目中那样的,再添加空格字符串进行调整即可。

2、分析数据

2.1、只有两行数据

当只有两行数据时,只需要分别相加再求出最小值即可。

[
    [2],
    [3, 4]
]

2+3=5    2+4=6 , 再取出相加和后的最小值,即为最小路径和。 

2.2、有三行数据

[
    [2],
    [3, 4],
    [6, 5, 7]
]

有三行数据时,路径选择就多了,一共有 4 种情况。

2 + 3 + 6 = 11      2 + 3 + 5 = 10   (前两项都是 2+3)

2 + 4 + 5 = 11      2 + 4 + 7 = 13   (前两项都是 2+4)

可以观察到,前两项的和我们在数据是两行的时候就已经计算过了,所以可以把他们保存到一个二维数组 dp[ i ][ j ] 中,后续直接使用数组中已经计算好的值,就不需要再遍历计算导致浪费时间了(如果数据很多的话)

tips:算完一行后把结果记录下来,用于下一行的计算。这个结果的物理意义就是从顶端到该点的最小路径和。

2.3、三类不同的节点

第一类:每行的第一个

每行的第一个形成的路径是直的,没有斜的,且每行第一个的坐标都是[ i ][ 0 ]

将当前节点的值更新为 上一行节点的和 加上 当前节点本来的值

计算方式:

dp[ i ][ j ] : 新定义的二维数组,用于更新节点的和

triangle[ i ][ j ] :原本的数组的值

dp[i][j] = dp[i-1][j] + triangle[i][j]
第二类:每行的最后一个

只能斜着往下走,上面没有值,且每一行最后一个的坐标 i == j

将当前节点的值更新为 上一行前一个的节点的和 加上 当前节点本来的值

计算方式:

dp[i][j] = dp[i-1][j-1] + triangle[i][j]
第三类:每一行中间的

在更新中间的节点时,需要比较是 当前列上一行节点的和 还是 前一列上一行的和小。

将较小值与当前值相加,得到输出:路径的最小和。

计算方式:

dp[i][j] = min(di[i-1][j], dp[i-1][j-1]) + triangle[i][j]

所有的都算完,所有可能的路径结果都在最后一行,对最后一行取最小值,即为正确结果 

3、代码实现

n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]

dp = triangle[:]
for i in range(n):
    for j in range(i + 1):
        if j == 0:
            dp[i][j] = dp[i-1][j] + triangle[i][j]
        if j == i:
            dp[i][j] = dp[i-1][j-1] + triangle[i][j]
        else:
            dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + triangle[i][j]
print(min(dp[n-1]))

 

这个代码还有改进的余地,明天再改进。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬取BOSS直聘招聘数据(详情页数据+__zp_stoken__逆向)

这里携带逆向方法进行请求 获得数据 需要逆向方法请私聊 , 下面部分只展示爬取思路 对网页进行分析抓包 设置参数 – 城市/薪资范围/职业 对网页进行请求获得数据集 利用xpath,soup等进行进行数据清洗 将数据一csv的格式保存

稳定性生产总结

本期我们来谈下稳定性生产这个话题,稳定性建设目标有两个:降发生、降影响, 在降发生中的措施是做到三点:系统高可用、 高性能、 高质量,三高问题确实是一个很热的话题,里面涉及很多点。 在降影响中要做到…

Express.js项目实战(1)—— 我的藏书馆

首先新建文件夹——myLibrary 在vscode中点击文件>点击 Duplicate Workspace(以工作区的方式打开文件夹myLibrary) 点击duplicate Workspace(打开工作区) 之后,会出现以下界面 点击打开文件夹,选择新建的文件夹,会出…

小黑逆向爬虫探索与成长之路:小黑独立破解毛毛租数据加密与解密

前言 有道和招标网的加密入口定位在前面两期做了详细的介绍,本小结将通过简单的关键词搜索定位到加密与解密入口 数据接口寻找与请求 根据响应数据长度,确定数据接口,发现传入的参数需要加密,响应的结果需要解密,后…

为什么鸿蒙系统那么火,就业岗位却很少?而且很少有公司愿意培养新人?

近期某乎上有这么一则问答提问:“为什么鸿蒙系统那么火,就业岗位却很少?而且很少有公司愿意培养新人?” 都说2024是原生鸿蒙的关键一年,华为鸿蒙各种大动作也没有停过。根据智联招聘数据显示,2023年9月-12月,鸿蒙相关职位数同比…

【Linux入门】Linux简史

Linux 是什么?Linux 是一款叫做操作系统的软件。 操作系统这款软件有什么样的意义呢?简单来说,比如有顾客买了一台笔记本电脑,这台笔记本电脑由电脑硬件组成,在这堆硬件上一定搭载了一款操作系统。正因为操作系统存在&…

【Unity每日一记】这些时间成员变量你是否清楚(Timescale,Time.deltaTime,Time.unscaledDeltaTime等)

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

dockerfile制作-pytoch+深度学习环境版

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 文档内容docker相关术语docker常用命令容器常用命令根据dockerfile创建容器dokerfile文件内容 docker问题:可能的原因和解决方法示例修改修改后的D…

C++笔记:命名空间

引入&#xff1a; 平常&#xff0c;我们在进行C编写时&#xff0c;一般我们都会默认在开始去写这样的代码&#xff1a; #include<iostream>//包含头文件using namespace std;//展开命名空间 这里就出现了与C语言不同的地方&#xff1a;这里的命名空间就是C对于C语言进…

Linux:Patch补丁、Diff使用

what的问题 diff命令&#xff0c;记录两个文件的差别&#xff0c;通过diff得到一个patch文件&#xff0c;也应用patch到另外一个文件&#xff0c;通过patch命令 diff and patch are intended to be used on text files. why的问题 Reason 1: diff can be useful by itself t…

如何实现多个PDF文件合并为一个PDF文件

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ hi&#xff0c;我是白特。 最近看到一个功能&#xff0c;十分感兴趣&#xff0c;也就是我们要将多个文件服务器中的PDF文件合并为一个PDF文件并以此进行下载打印操作。 那么直接让我们一起看下它的实现思路吧。 …

OpenHarmony实战:硬件适配之HCS应用

一、HCS 配置管理 HCS(HDF Configuration Source)是 HDF 驱动框架的配置描述参数文件&#xff0c;内容以 Key-Value 为主要形式。它实现了配置代码与驱动代码解耦&#xff0c;便于开发者进行配置管理。 HC-GEN(HDF Configuration Generator)是 HCS 配置转换工具&#xff0c;可…

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 &#xff08;二&#xff09;Git&#xff08;分布式版本控制系统&#xff09;:&#xff08;二&#xff09;SVN&#xff08;集中式版本控制系统&#xff09;&#xff08;三&#xff09;TortoiseGit一、下载安装 git二、安装过程…

“转行做程序员”很难?这里有4个建议

近几年来&#xff0c;传统行业多处于经济下行&#xff0c;加上互联网行业的赚钱效应&#xff0c;想要转行到这一行的人越来越多&#xff0c;其中程序员这个行业更是很多人梦寐以求的。 但另一方面&#xff0c;我们也发现&#xff0c;这些想要转行的同学们往往会遇到很多困扰。…

企业员工在线培训系统功能介绍

随着信息技术的飞速发展&#xff0c;企业员工培训方式正逐步从传统的面授转向灵活高效的在线培训。一个综合性的企业员工在线培训系统能够为员工提供多样化的学习资源、便捷的学习途径和有效的学习监督&#xff0c;以下是该系统的主要功能详细介绍&#xff1a; 1. 课程功能 线…

如何应对光模块故障,只需一条命令!

你们好&#xff0c;我的网工朋友。 是设备就有故障&#xff0c;光模块也不例外&#xff0c;而且很多项目的故障首先要排除光模块的问题。 像光模块型号选用是否正确&#xff1f; 使用的跳线是否正确&#xff1f; 交换机接口是否用匹配&#xff1f; ....各种各样的问题&…

MySQL中count(*) 和 count(1)区别

MySQL 中 count(*) 和 count(1) 的异同 count() 函数的基本原理 语法&#xff1a; COUNT(expr)其中&#xff1a; expr 可以是字段名、常量、表达式或星号 (*)。 用法&#xff1a; count() 函数用于统计满足特定条件的记录数量。它可以有以下几种用法&#xff1a; 1. 统计…

【带你了解下前端开发语言有那些】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

JavaEE初阶之线程安全(一)

目录 题外话 正题 1.线程调度是随机的 2.修改共享数据 知识点 线程同步机制 线程异步机制 举例说明 synchronized() 知识点 举例说明 举例代码详解 死锁 举个例子: 代码 小结 题外话 这两天忽冷忽热的感冒了,昨天状态特别不好断更了一天,今天继续加油! 我会把…

【RT_Thread】---stm32f407zgt6使用env配置工程

用rt_thread env配置工程 1. git rt_thread 源码 2.找到对应芯片厂家扳机支持包 3 重新命名一个自己项目的工程 4 打开env 配置驱动 具体参考官方&#xff1a;Env 用户手册 (rt-thread.org) 5 修改路径为英文 6 修改完boad init 就应该可以用了(还有系统时钟不然会有问题)…