news 2026/4/23 22:22:21

动态规划入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划入门

动态规划入门


文章目录

      • 动态规划入门
        • 动态规划的概念
        • dp的重点
        • 必须存在 “重叠子问题”
        • 必须满足 “最优子结构”
        • 状态定义与状态转移方程
        • 例子
        • 动态规划的解题步骤
        • 例题

动态规划的概念

动态规划(Dynamic Programming,DP):是一种求解多阶段决策过程最优化问题的方法。在动态规划中,通过把原问题分解为相对简单的子问题,先求解子问题,再由子问题的解而得到原问题的解。

动态规划是一种解决多阶段决策最优化问题的算法思想,核心逻辑是:将复杂问题分解为若干个重叠的子问题,通过存储子问题的最优解,避免重复计算,最终推导出原问题的最优解。


dp的重点

其中的一些要点:


例子

假设你是商店收银员,现在需要给顾客找5 元零钱,手头的硬币面值只有三种:1元、2元、5元(硬币数量无限)。

要求:用最少的硬币数凑出 5 元,怎么凑?

我们用dp[i]表示:凑出 i 元零钱需要的最少硬币数

比如:dp[1] = 凑 1 元需要的最少硬币数;

对于每个金额i(从 1 到 5),我们可以尝试用每一种硬币面值coin(1、2、5):


动态规划的解题步骤
  1. 定义状态:明确 dp [i](或 dp [i][j]、dp [i][j][k])代表什么,必须具体、无歧义;
  2. 确定边界条件:初始化最小子问题的解(如 dp [0]、dp [1]),避免递推时数组越界或逻辑错误;
  3. 推导状态转移方程:核心步骤,找到 “当前状态” 与 “前序状态” 的关系;
  4. 计算最终结果:通过迭代(推荐)或递归 + 记忆化,从边界条件递推到原问题的解。

例题

力扣983.最低票价

在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为days的数组给出。每一项是一个从1365的整数。

火车票有三种不同的销售方式

通行证允许数天无限制的旅行。 例如,如果我们在第2天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第2天、第3天、第4天、第5天、第6天、第7天和第8天。

返回你想要完成在给定的列表days中列出的每一天的旅行所需要的最低消费

intdata[3]={1,7,30};intmincostTickets(int*days,intdaysSize,int*costs,intcostsSize){int*dp=(int*)malloc((daysSize+1)*sizeof(int));for(inti=0;i<daysSize;i++){dp[i]=9999;}dp[daysSize]=0;for(inti=daysSize-1;i>=0;i--){for(intk=0;k<3;k++){intj=i;while(j<daysSize&&data[k]+days[i]>days[j]){j++;}inttemp=costs[k]+dp[j];if(temp<dp[i]){dp[i]=temp;}}}returndp[0];}

力扣42.接雨水

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

intmax(inta,intb){returna>=b?a:b;}intmin(inta,intb){returna>=b?b:a;}inttrap(int*height,intheightSize){if(heightSize<=2){return0;}intl[heightSize],r[heightSize];l[0]=height[0];for(inti=1;i<heightSize;i++){l[i]=max(l[i-1],height[i]);}r[heightSize-1]=height[heightSize-1];for(inti=heightSize-2;i>=0;i--){r[i]=max(r[i+1],height[i]);}intans=0;for(inti=1;i<heightSize-1;i++){ans+=max(0,min(l[i-1],r[i+1])-height[i]);}returnans;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:54:06

14、并发与底层机制:SML/NJ 深入解析

并发与底层机制:SML/NJ 深入解析 1. 并发中的信号量 在并发编程中,信号量是一种重要的同步机制。这里介绍了使用同步变量(M - 变量)实现信号量的替代方法,这种实现更接近 Java 等语言的传统实现,多个线程作为对等体合作以保证临界区的安全,与依赖中央管理线程的实现形…

作者头像 李华
网站建设 2026/4/23 14:24:55

19、《Swerve服务器详细设计解析》

《Swerve服务器详细设计解析》 在软件开发领域,服务器的设计与实现是一个复杂且关键的任务。本文将深入探讨Swerve服务器的详细设计,包括其模块依赖、构建过程、各层功能以及关键代码实现。 模块依赖与代码遵循方式 在Swerve服务器的设计中,顶层三层模块之间的主要依赖关…

作者头像 李华
网站建设 2026/4/23 18:37:22

Awk 例程大全

Awk 例程大全&#x1f4da; Awk 基础语法awk pattern { action } file awk -f script.awk file&#x1f527; 常用选项选项说明-F指定字段分隔符-v定义变量-f从文件读取 awk 脚本-F,指定逗号为分隔符-F[:\t]多个分隔符-F\t制表符分隔&#x1f4ca; 内置变量变量说明示例值NR当前…

作者头像 李华
网站建设 2026/4/23 14:25:20

38、系统与应用性能监测工具全解析

系统与应用性能监测工具全解析 在计算机使用过程中,系统性能和应用性能的监测至关重要。了解系统硬件的相关参数以及掌握有效的性能监测工具,能够帮助我们及时发现并解决系统运行缓慢等问题。 1. 设备相关信息 设备的信息包含多个方面,以下是一些常见的设备参数及含义: …

作者头像 李华
网站建设 2026/4/23 0:48:20

39、代码性能调优工具全解析

代码性能调优工具全解析 在软件开发过程中,性能调优是至关重要的一环。本文将介绍几种常用的性能调优工具,包括 Valgrind、ltrace、strace、gprof 和 gcov,并通过具体示例展示它们的使用方法和效果。 Valgrind 检查指令效率 Valgrind 是一个功能强大的工具套件,可用于检…

作者头像 李华
网站建设 2026/4/22 22:05:40

ExifToolGui图片元数据编辑终极指南:快速修改GPS和EXIF信息

ExifToolGui图片元数据编辑终极指南&#xff1a;快速修改GPS和EXIF信息 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 想要轻松编辑图片的GPS坐标和EXIF信息吗&#xff1f;ExifToolGui作为ExifTool的图形界…

作者头像 李华