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

2024-04-02 07:28

本文主要是介绍备战蓝桥杯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]))

 

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

这篇关于备战蓝桥杯Day36 - 动态规划 - 三角形最小路径和问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869342

相关文章

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.