【LeetCode】动态规划—120. 三角形最小路径和(附完整Python/C++代码)

news2024/9/30 16:40:40

动态规划—120. 三角形最小路径和

  • 前言
  • 题目描述
  • 基本思路
    • 1. 问题定义
    • 2. 理解问题和递推关系
    • 3. 解决方法
      • 3.1 动态规划方法
      • 3.2 空间优化的动态规划
    • 4. 进一步优化
    • 5. 小总结
  • 代码实现
    • Python
      • Python代码实现
      • Python 代码解释
    • C++
      • C++代码实现
      • C++ 代码解释
  • 总结:

前言

三角形最小路径和 是动态规划问题的经典应用之一。在给定一个三角形数组时,如何从顶部到底部找到最小的路径和?这类问题不仅考验我们的动态规划思维,也要求我们有效地优化空间和时间复杂度。

通过自底向上的动态规划方法,我们可以逐层计算出最优解,而不必枚举所有路径。本文将详细介绍如何通过动态规划解决这个问题,结合 Python 和 C++ 实现来帮助你理解每一步的细节和优化过程。

题目描述

在这里插入图片描述

基本思路

1. 问题定义

给定一个三角形的二维数组 triangle,其中 triangle[i] 表示三角形第 i 层的数字。你需要从三角形的顶层开始移动到底层,移动的规则是每次只能移动到下一层相邻的数字。要求找到从顶层到底层的最小路径和。

2. 理解问题和递推关系

问题的本质是一个典型的动态规划问题,核心是从三角形的顶端到底端的最小路径和。可以通过自底向上的动态规划来解决这个问题:

  • 定义一个 dp 数组,其中 d p [ i ] [ j ] d p[i][j] dp[i][j] 表示从 ( i , j ) (i, j) (i,j) 位置到底层的最小路径和。

  • 递推关系:

d p [ i ] [ j ] = min ⁡ ( d p [ i + 1 ] [ j ] , d p [ i + 1 ] [ j + 1 ] ) + triangle ⁡ [ i ] [ j ] d p[i][j]=\min (d p[i+1][j], d p[i+1][j+1])+\operatorname{triangle}[i][j] dp[i][j]=min(dp[i+1][j],dp[i+1][j+1])+triangle[i][j]

意思是当前位置的最小路径和等于当前位置的值加上下一层相邻两个位置中的较小值。

3. 解决方法

3.1 动态规划方法

  1. 自底向上计算最小路径和,首先初始化最后一层的 dp 值为三角形最后一层的值。
  2. 从倒数第二层开始,逐层向上计算每个位置的最小路径和,更新 dp 数组。
  3. 最终 dp[0][0] 即为从顶层到底层的最小路径和。

3.2 空间优化的动态规划

  • 由于每次计算只需要下—层的状态,因此可以优化空间复杂度,只使用一个一维数组 dp 来存储每一层的最小路径和,逐层更新。

4. 进一步优化

  • 空间优化:可以将空间复杂度从 O ( n ∧ 2 ) O\left(n^{\wedge} 2\right) O(n2) 降低到 O ( n ) O(n) O(n) ,只需一个一维数组来存储当前层的状态。
  • 自底向上计算:动态规划方法从底部向顶部计算,每一层的结果依赖于下一层的值,因此可以直接在原数组上操作,进一步减少空间开销。

5. 小总结

  • 动态规划提供了一种从底向上的方法来有效解决该问题,时间复杂度为 O ( n ∧ 2 ) O\left(n^{\wedge} 2\right) O(n2) ,空间复杂度可以优化为 O ( n ) O(n) O(n)
  • 动态规划的关键是找到合适的状态转移方程,在本题中,我们通过递推公式逐步求解每一层的最小路径和,最终得到全局最优解。

以上就是三角形最小路径和问题的基本思路。

代码实现

Python

Python代码实现

class Solution:
    def minimumTotal(self, triangle: list[list[int]]) -> int:
        if not triangle:
            return 0
        
        n = len(triangle)
        # 初始化dp数组,最后一层即为dp的初始值
        dp = triangle[-1][:]
        
        # 从倒数第二层开始向上计算
        for i in range(n - 2, -1, -1):
            for j in range(len(triangle[i])):
                # 更新dp[j]为当前层的最小路径和
                dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j]
        
        # dp[0]存储的是从顶到底的最小路径和
        return dp[0]

Python 代码解释

  • 初始化:将 dp 数组初始化为三角形最后一层的值,作为最底层的初始状态。
  • 自底向上计算:从倒数第二层开始,逐层向上计算每个位置的最小路径和,通过更新 dp 数组来保存当前层的最优解。
  • 返回结果:最终返回 dp[0],即从顶到底的最小路径和。

C++

C++代码实现

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        if (triangle.empty()) return 0;
        
        int n = triangle.size();
        // 初始化dp数组,最后一层即为dp的初始值
        vector<int> dp(triangle[n - 1]);
        
        // 从倒数第二层开始向上计算
        for (int i = n - 2; i >= 0; --i) {
            for (int j = 0; j < triangle[i].size(); ++j) {
                // 更新dp[j]为当前层的最小路径和
                dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
            }
        }
        
        // dp[0]存储的是从顶到底的最小路径和
        return dp[0];
    }
};

C++ 代码解释

  • 初始化:创建 dp 数组,将其初始化为三角形最后一层的值。
  • 自底向上递推:从倒数第二层开始,逐层更新 dp 数组中的最小路径和。每个位置的值通过取下一层相邻位置的较小值加上当前值得到。
  • 返回结果:最终 dp[0] 即为从顶到底的最小路径和。

总结:

  • 动态规划是解决路径优化问题的常用方法之一。通过自底向上的方式,我们可以在不遗漏任何可能性的情况下找到最优解。本题中,空间复杂度可以从 O ( n 2 ) O(n^2) O(n2) 优化到 O ( n ) O(n) O(n),即使用一维数组来保存状态。
  • 动态规划的核心是通过递推公式计算每个位置的最小路径和,并在全局最优解的基础上不断更新当前的最优解。理解这些技巧将为解决更多类似的路径问题提供坚实的基础。

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

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

相关文章

CHI协议中的LPID

总目录&#xff1a; CHI协议简读汇总-CSDN博客https://blog.csdn.net/zhangshangjie1/article/details/131877216 当某个requester包含多个logically separate processing agent时&#xff0c;使用这个LPID&#xff1b; LPID在如下的opcode下&#xff0c;取值需要正确&#…

无人机在抗洪方面的作用!

一、实时监测与灾情评估 无人机能够迅速抵达受灾区域上空&#xff0c;通过搭载的高清摄像头、红外热成像仪等传感器&#xff0c;实时传输灾区图像和视频&#xff0c;为救援指挥中心提供第一手资料。有助于快速了解灾情&#xff0c;从而制定科学合理的救援方案。 二、搜救定位…

SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器

SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。 从RequestMappingHandlerMapping寻找: AbstractHandle…

②三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务

三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务https://item.taobao.com/item.htm?ftt&id834634632647 MELSEC 通信单元 MELSEC 转 RS485 &#xff08;接上一章&#xff09; 动作指示灯 电源指示灯(PWR) 表示 MS-A1-80X1 通讯模块是否处于通电中。…

用ChatGPT工作提效,这些方法太实用了!

被任务和紧迫的截止日期压垮了吗&#xff1f;ChatGPT 是提升工作效率的关键武器。探索这篇指南&#xff0c;快速提升您的工作效率&#xff01; ChatGPT 在现代职场中的角色 随着数字时代的到来&#xff0c;技术进步彻底改变了商业世界&#xff0c;自动化和效率已成为企业保持…

怎样才能设计出全面且详细的测试要点?

今天想跟大家分享一个案例&#xff0c;关于一个测试场景引发的测试要点思考。 废话不多说&#xff0c;上菜&#xff01; 情况介绍 某天&#xff0c;开发同事提交了一个功能优化单&#xff0c;大概情况就是&#xff1a;为了节省内存使用&#xff0c;开启了一个配置&#xff0…

求解线性方程的方法步骤(含例题),附解线性方程计算器

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4d0; 在数学和工程问题中&#xff0c;线性方程是一类非常基础且常见的问题。无论是解决简单的一元一次方程&#xff0c;还是复杂的多元线性方程组&#xff0c;都有一定的方法和步骤可以遵循。今天&#xff0c;我们…

体育课评分系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;点明册管理&#xff0c;体育教案管理&#xff0c;教学评分管理&#xff0c;学生心率管理&#xff0c;身体素质测评管理&#xff0c;教学比赛成绩管理 微信端账号功能包括&#xf…

Autosar CP系列:设计模式之仲裁模式和信号质量模式

本文讲解关于Autosar的另外两个设计模式&#xff1a;仲裁模式和信号质量模式&#xff0c;上篇花大量篇幅讲解了《传感器执行器模式》。 1.仲裁模式 为了解决多个不同提供者或请求者之间的仲裁问题&#xff0c;引入一个新的组件&#xff0c;这个组件的作用是管理所有来自不同请…

安防监控/智慧安防EasyCVR视频汇聚监控平台无法启动并报错“no space left on service”是什么原因?

视频汇聚/安防监控/智慧安防EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台可以引入AI智能分析能力&#xff0c;能够实现对视频中的特…

Spring Cloud面试题收集

Spring Cloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 spring boot 的开发风格做到一键启动和部署。…

基于SpringBoot - Netty框架的云快充协议(充电桩协议)

云快充协议是一种标准通信协议&#xff0c;主要用于电动车与充电桩之间的数据交换。该协议包含了充电请求、状态查询、支付等多个功能模块。这些功能的实现不仅需要对协议进行深入理解&#xff0c;还需要编写相应的代码进行封装。 软件架构 1、提供云快充底层桩直连协议&#…

“DNA亲和纯化测序:汇智生物的精准分析“

&#x1f331; 汇智生物 | 专注农业&植物基因组分析 &#x1f331; &#x1f393; 教授【优青】团队亲自指导&#xff01;提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效&#xff0c;为农植物科研保驾护航&#xff01; &#x1f52c; 专业实验外包服务&am…

100个超有用的Python知识点!

一、基础语法 1.变量的定义与赋值。 2.不同数据类型&#xff08;整数、浮点数、字符串、布尔值、列表、元组、字典、集合&#xff09;的使用。 3.运算符&#xff08;算术、比较、逻辑、赋值、位运算等&#xff09;。 4.控制流语句&#xff08;if-else、for 循环、while 循环…

IDEA 最新版创建 Sping Boot 项目没有 JDK8 选项的解决方案

问题 今天新建一个 Java 项目写 demo 时&#xff0c;发现 Idea 上只能勾选 Java 17、21、23 三个版本 解决方案 IDEA 页面创建 Spring 项目&#xff0c;其实是访问 spring initializr 去创建项目。我们可以通过阿里云国服去间接创建 Spring 项目。服务器 URL 地址替换为 ht…

如何将list嵌套的list的[]去掉

如果list里里面的元素是数字&#xff0c;‘1’也是可以的&#xff0c;那么我们可以使用np.ravel a [[1,2,3], [5, 2, 8], [7,8,9]]list(np.ravel(a)) #[1, 2, 3, 5, 2, 8, 7, 8, 9]对于不规则List c[[‘云阳站’], [‘双江’, ‘木古’], [‘滨双线’], [‘滨双线’, ‘云田线…

【Echarts地图开发全流程加全套代码】

前言 本篇分享近期做的项目echarts相关地图开发的相关细节和避坑细节&#xff01;&#xff01; 一、地图Json文件 echarts地图采用官网的type类型map进行配置开发 Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&…

Excel中查找某个值的位置,用位置取值

有 2022 年 1 月的日销售额统计表如下所示&#xff1a; 找出销售额最大的是哪一天&#xff0c;在 C2 单元格里输入&#xff1a; spl("E(?1).pmax(Sales)",A1:B32)返回结果 12 接着找出销售额最大的那天的前 5 天和后 5 天的销售额&#xff1a; spl("E(?1).…

RAR格式文件解压:适合各平台的RAR解压软件下载推荐

RAR格式是一种广泛使用的压缩格式&#xff0c;因其优秀的压缩率和多样化的功能而受到用户的喜爱。然而&#xff0c;尽管许多操作系统自带基本的压缩解压功能&#xff0c;但要处理RAR格式文件&#xff0c;通常需要借助专门的解压软件。本文将为用户推荐适合Windows、Mac、Linux和…

支付宝“碰一下”微信

“‘碰一下’风头正盛&#xff0c;他们设立了专门的项目组&#xff0c;特别卷&#xff0c;动不动搞到两点&#xff0c;有些受不了的&#xff0c;就主动活水到别的团队了。他们内部也在各种挖人&#xff0c;善攻&#xff08;支付宝副总裁李佳佳的花名&#xff09;为了这个项目拼…