备战蓝桥杯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]))

 

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

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

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

相关文章

java项目依赖的依赖加载不到

1、描述: 一个项目包含多个子模块,并且可以根据profiles切换环境。 然后依赖的依赖就是加载不到 上面flow-es-6.8是我封装的一个环境。 2、解决: profiles里要加上默认一个环境配置,如下红色部分: 虽然我在idea右边maven中的profiles选项…

【ElementUI】详细分析DatePicker 日期选择器

目录 前言1. 通用Demo2. 快捷键3. 参数 前言 对于全栈玩家,各个组件都需相应了解才可做好前后端的CRUD 以下为实战结合Element官网的心得体会 如图所示: 1. 通用Demo 如果只想要一个选择日期,而不是范围,Demo如下:…

Docker搭建LNMP环境实战(09):安装mariadb

1、编写mariadb部署配置文件 在文件夹:/mnt/hgfs/dockers/test_site/compose下创建文件:test_site_mariadb.yml,内容如下: version: "3.5" services:test_site_mariadb:container_name: test_site_mariadbimage: mari…

逐步学习Go-Select多路复用

概述 这里又有多路复用,但是Go中的这个多路复用不同于网络中的多路复用。在Go里,select用于同时等待多个通信操作(即多个channel的发送或接收操作)。Go中的channel可以参考我的文章:逐步学习Go-并发通道chan(channel)…

JS基本类型作用域作用域链

#### 作用域链 作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。看一个例子 js var a 1 function fn () {var b a 1console.log(b) } fn() ### 从代码执行来看 首先在创建fn函数时,会创建一个预先包含全局变量对象的作用域链&am…

Gparted工具 初始化磁盘

Gparted工具 初始化磁盘 1、安装 没有此工具请先安装: yum install epel-release yum install gparted yum install yum-utils git gnome-common gcc-c yum-builddep gparted 2、打开Gparted工具,初始化磁盘 使用具有root权限的普通用户打开gparted&…

HWOD:整型数组排序

一、知识点 while(1){}表示永久循环 使用break结束循环 二、题目 1、描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 2、数据范围 1<n<1000 0<val<100000 3、输入 第一行输入数组元素个数 第二行输入待排序的数组&#x…

电商技术揭秘二:电商平台推荐系统的实现与优化

文章目录 一、推荐系统的重要性1.1 提升用户体验1.1.1 个性化推荐增强用户满意度1.1.2 减少用户选择困难 1.2 增加销售额1.2.1 促进交叉销售和捆绑销售1.2.2 提高用户购买转化率 1.3 数据分析与用户行为理解1.3.1 挖掘用户偏好和购买习惯1.3.2 为产品开发和库存管理提供数据支持…

npm ERR! code CERT_HAS_EXPIRED 淘宝镜像失效

近期vue安装失败&#xff0c;具体如下&#xff1a; 1.先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2.certificate has expired npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.o…

rollup 插件的使用及常用插件介绍

rollup 插件的使用及常用插件介绍 如果我们需要打包更为复杂的代码&#xff0c;就需要配置一些插件来实现。比如导入使用 NPM 安装的模块、使用 Babel 编译代码、处理 JSON 文件等等。 插件使用 rollup 是用于打包 JavaScript 的工具&#xff0c;如果我们想处理其他文件&…

Windows安装禅道系统结合Cpolar实现公网访问内网BUG管理服务

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

943: 顺序表插入操作的实现

学习版 【C语言】 需要扩充数组 【C】 #include <iostream> #include <vector> #include <algorithm> using namespace std; class MyLinkedList { public:struct LinkedNode{int val;LinkedNode* next;LinkedNode(int x) :val(x), next(NULL) {}};MyLin…

TypeScript语法快速上手

TypeScript语法 对比ts编译器类型注解新增类型数组自定义类型注解函数类型对象类型元组类型类型推断枚举类型 对比 最大区别&#xff1a;ts能在编译时就能发现类型错误的问题&#xff0c;而js只有在系统运行时再通过异常中断来发现 ts的底层仍是js&#xff0c;但ts能够有效减少…

代码随想录算法训练营第二十七天|131.分割回文串、93.复原IP地址

文档链接&#xff1a;https://programmercarl.com/ LeetCode131.分割回文串 题目链接&#xff1a;https://leetcode.cn/problems/palindrome-partitioning/ 思路&#xff1a;把回溯的树画出来就好很多。startIndex用来控制切割的位置 例如对于字符串abcdef&#xff1a; 组…

深度学习入门:从理论到实践的全面指南

深度学习入门&#xff1a;从理论到实践的全面指南 引言第一部分&#xff1a;深度学习基础第二部分&#xff1a;数学基础第三部分&#xff1a;编程和工具第四部分&#xff1a;构建你的第一个模型第五部分&#xff1a;深入学习结语 引言 大家好&#xff0c;这里是程序猿代码之路。…

阿里巴巴实习面经

本人bg&#xff1a;浙江大学&#xff0c;计算机研二&#xff0c;本科也是浙大计算机专业的。 在阿里巴巴达摩院实习&#xff0c;算法岗&#xff0c;我是去年拿到的阿里巴巴达摩院的实习offer&#xff0c;这个过程还是比较惊心动魄&#xff0c;所以我称之为惊心动魄版本&#xf…

golang语言系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的Aut…

微信小程序中实现埋点的方法

在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…

html基础:颜色的 5 种表示方法(最全!)

你好&#xff0c;我是云桃桃。一个希望帮助更多朋友快速入门 WEB 前端的程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 HTML 颜色在网页设计中扮演着重要角色&#xff0c;给网页增加颜色可以增强用户体验&#xff0c;…

AI行业买英伟达GPU,花的钱比赚的多17倍

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 有人却表示「很合理」。 搞 AI 大模型&#xff0c;实在太烧钱了。 我们知道&…