动态规划的框架(套路), 总结

本文总结了动态规划的常见模型,包括数字三角形、最长上升子序列、字符串处理、01背包问题等,并提供了相应的LeetCode题目,帮助读者通过实例深入理解动态规划的套路,提升解题能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    动态规划题目千变万化,很多人刚入门时候都觉得非常难以理解,题目越做越挫,越做打击越大,看着别人的题解,心里只能默念一句卧槽,这都能写出状态方程!

    走了那么多弯路,才发现问题所在,主要原因是因为基础的东西没掌握好,力扣上很多题目都是从这些基础的套路演变出来的,把基础问题的状态方程掌握和理解好,自己自然也就能写出其他题目的状态方程了。

    所谓一生二,二生三,三生万物,把这一、二彻底弄懂了,其他花里胡哨的也自然就迎刃而解了。

    如果能按照下面的专题刷,先读懂例题,再把本文给出的leetcode的题目刷一遍,都是一样的框架(套路),保证您对动态规划的理解上一个新的台阶。

    动态规划是运筹学里的一个分支, 常常用一个数来表示一个集合, 如数字三角形模型第一个题, dp[i][j]表示为所有从点(0,0)走到点(i,j)的所有合法路径, 由于答案只要最小值, 所以dp[i][j]只保存最小值, 理解好这一点,至关重要。

一、数字三角形模型

例题:给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。

解题思路:假设矩阵m的大小为M*N,行数为M,列数为N。生成大小和m一样的矩阵dp,行数为M,列数为N。

dp[i][j]的值表示从左上角,也就是(0,0)位置,走的(i,j)位置的最小路径和。

base case:如下图所示,第一行只能有向右走,第一列只能向下走,所以分别就是行的和and列的和。

leetcode题目:

64 最小路径和(本题)

题解: https://leetcode-cn.com/problems/minimum-path-sum/solution/dong-tai-gui-hua-shu-zi-san-jiao-xing-mo-xing-by-a/

120  三角形最小路径和

题解: https://leetcode-cn.com/problems/triangle/solution/shu-zi-san-jiao-xing-dp-gun-dong-shu-zu-you-hua-by/

931 下降路径最小和 

1289  下降路径最小和 II

 

二、最长上升子序列模型(线性Dp)

leetcode题目:

276. 栅栏涂色 

题解: https://leetcode-cn.com/problems/paint-fence/solution/java-dong-tai-gui-hua-by-william-43/

300. 最长上升子序列

368. 最大整除子集

题解:https://leetcode-cn.com/problems/largest-divisible-subset/solution/368-zui-da-zheng-chu-zi-ji-dp-shi-jian-fu-za-du-on/

640.最长数对链

673. 最长递增子序列的个数

 

三、字符串

 

leetcode 题目:

72  编辑距离

132. 分割回文串 II   

题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/acw-dong-tai-gui-hua-by-acw_weian/

410. 分割数组的最大值    

题解:https://leetcode-cn.com/problems/split-array-largest-sum/solution/acw-dong-tai-gui-hua-by-acw_weian-2/

583 两个字符串的删除操作

712  两个字符串的最小ASCII删除和

940. 不同的子序列 II   

题解: https://leetcode-cn.com/problems/distinct-subsequences-ii/solution/dong-tai-gui-hua-wan-lu-li-cheng-by-acw_weian/

1035. 不相交的线

1143. 最长公共子序列

四、01背包问题

例题: 一个背包有一定的承重W,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。

 

解题思路:按照物品序号i进行遍历,要么拿这件物品,要么不这件物品

定义dp[i][j] 

i:为物品序号, j:为当前承受的重量

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + values[i]) 

dp[i-1][j]: 不拿当前i序号物品

dp[i-1][j-w[i]] + values[i]: 拿当前物品,其中比较难理解的是dp[i-1][j-w[i]] 

dp[i-1][j-w[i]] : 因为该条件下是拿了当前物品,且当前为dp[i][j],当前承重为j,且当前物品重量为w[i],所以上一个的承重为j-w[i]

注意后续只有当j+w[i]小于最大承重W才能拿当前物品。

对于dp矩阵来说,行数是物品的数量n,列数是背包的重量w。从左到右,再从上到下依次计算所有的dp值即可。

leetcode题目

416. 分割等和子集

983. 最低票价

五、状态机模型

 

六、状态压缩DP

464. 我能赢吗(技巧满分)

题解: https://leetcode-cn.com/problems/can-i-win/solution/464-wo-neng-ying-ma-bao-sou-ji-yi-hua-sou-suo-by-a/

七、区间DP


471. 编码最短长度的字符串 - 区间DP

题解:https://leetcode-cn.com/problems/encode-string-with-shortest-length/solution/471-bian-ma-zui-duan-chang-du-de-zi-fu-chuan-qu-ji/

486. 预测赢家

546. 移除盒子(困难)

题解:https://leetcode-cn.com/problems/remove-boxes/solution/fei-di-gui-ban-qu-jian-dp-by-acw_weian/

1216. 验证回文串III (中等)

题解: https://leetcode-cn.com/problems/valid-palindrome-iii/solution/qu-jian-dp-java-by-acw_weian/

647. 回文子串

题解: https://leetcode-cn.com/problems/palindromic-substrings/solution/647-hui-wen-zi-chuan-qu-jian-dp-shi-jian-fu-za-du-/

1547. 切棍子的最小成本

题解:https://leetcode-cn.com/problems/minimum-cost-to-cut-a-stick/solution/1547-qie-gun-zi-de-zui-xiao-cheng-ben-qu-jian-dp-b/

5498. 石子游戏 V

https://leetcode-cn.com/problems/stone-game-v/

八、树形DP

 

九、数位统计DP

 

十、记忆化搜索

 

十一、概率DP

514. 自由之路

https://leetcode-cn.com/problems/freedom-trail/solution/514-zi-you-zhi-lu-bao-li-dao-ji-yi-hua-sou-suo-by-/

1230. 抛掷硬币

题解:https://leetcode-cn.com/problems/toss-strange-coins/solution/gai-lu-dp-pao-zhi-ying-bi-java-by-acw_weian/

十二、找规律

这类题目往往需要从题意里发现规律

375. 猜数字大小 II

题解: https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/solution/375-cai-shu-zi-da-xiao-ii-bao-sou-dong-tai-gui-hua/

467. 环绕字符串中唯一的子字符串 

题解: https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/solution/zhao-gui-lu-dong-tai-gui-hua-java-by-acw_weian/

546. 移除盒子(困难),也是区间Dp

题解:https://leetcode-cn.com/problems/remove-boxes/solution/fei-di-gui-ban-qu-jian-dp-by-acw_weian/

887. 鸡蛋掉落 

题解:https://leetcode-cn.com/problems/super-egg-drop/solution/887-ji-dan-diao-luo-dong-tai-gui-hua-er-fen-shi-ji/
1240. 铺瓷砖

题解:https://leetcode-cn.com/problems/tiling-a-rectangle-with-the-fewest-squares/solution/1240-pu-ci-zhuan-dong-tai-gui-hua-by-acw_weian/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值