深入浅出的动态规划
求最优子问题,动态规划和其它遍历算法(如深/广度优先搜索)都是将原问题拆成多个子问题然后求解。他们之间最本质的区别是,动态规划保存子问题的解(使用dp[]),避免重复计算。
动态规划的题型丰富多样,没有规律可循。但是它们的思想是一样的,这里给出作者总结的做题四个步骤,适用于所有动态规划
- 确认状态:开一个数组,一维二维都行。用来存储最优子问题。这里还要思考两点
- 最后一步:确定最后一步,整体问题就分为【最优子问题,最后一步】
- 子问题:将原问题转换成一个子问题,规模变小,假设这个子问题就是最优的。
- 转移方程:根据上面两个思考,求得转移方程f[x]=...
- 初始条件和边界条件:
- 初始条件比如:f[0]=0,用转移方程算不出来的,需要手动定义
- 边界情况:什么时候停下来,不要让数组越界
- 计算顺序:保证计算等式左边的时候,等式右边的数全部算完。一般都是从小到大,for循环搞定
动态方程适用于:计数,求最大值最小值,求存在性三类问题,下面按照这三类进行总结。
一.计数
滚动数组也可以看作动态规划的升级版,因为滚动数组的空间复杂度为O(1)。该题的动态规划只用到前2个数,就可以使用2个变量存储,而不是数组存储。
该题和"爬楼梯"是一模一样(基础版)
(升级版):根据不同的条件使用不同的转移方程
两种动态规划,使用的转移方程不同
二.求最值
基础版:
升级版1:需要2个dp[],遇到负数进行交换
升级版2:
该题与上面题型一模一样,就是一个求最大,一个求最小
下面这些题,它们其实就是简单的一维数组,每个dp都是循环赋值的。
打家劫舍1
打家劫舍(升级版):dp[ ]是通过递归进行累加的。
对于树一般都是后序遍历。
这个题是从左上角开始的动态规划,它的特殊点是有一个特殊的规律,这个规律就是动态方程
三.求存在性
该题使用贪心算法效率比较高,贪心算法后面专门放文章讲
四.背包问题
变为01背包问题:给定一定的物品,求是否能装满和为num/2的背包
01背包问题:
寄语:世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)