动态规划总结篇

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 动态规划最强总结篇! 如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。 关于动态规划,在专题第一篇[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)就说了动规五部曲,**而且强调了五部对解动规题目至关重要!** 这是Carl做过一百多道动规题目总结出来的经验结晶啊,如果大家跟着「代码随想哦」刷过动规专题,一定会对这动规五部曲的作用感受极其深刻。 动规五部曲分别为: 1. 确定dp数组(dp table)以及下标的含义 2. 确定递推公式 3. dp数组如何初始化 4. 确定遍历顺序 5. 举例推导dp数组 动规专题刚开始的时候,讲的题目比较简单,不少录友和我反应:这么简单的题目 讲的复杂了,不用那么多步骤分析,想出递推公式直接就AC这道题目了。 **Carl的观点一直都是 简单题是用来 巩固方法论的**。 简单题目是可以靠感觉,但后面稍稍难一点的题目,估计感觉就不好使了。 在动规专题讲解中,也充分体现出,这动规五部曲的重要性。 还有不少录友对动规的理解是:递推公式是才是最难最重要的,只要想出递归公式,其他都好办。 **其实这么想的同学基本对动规理解的不到位的**。 动规五部曲里,哪一部没想清楚,这道题目基本就做不出来,即使做出来了也没有想清楚,而是朦朦胧胧的就把题目过了。 * 如果想不清楚dp数组的具体含义,递归公式从何谈起,甚至初始化的时候就写错了。 * 例如[动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html) 在这道题目中,初始化才是重头戏 * 如果看过背包系列,特别是完全背包,那么两层for循环先后顺序绝对可以搞懵很多人,反而递归公式是简单的。 * 至于推导dp数组的重要性,动规专题里几乎每篇Carl都反复强调,当程序结果不对的时候,一定要自己推导公式,看看和程序打印的日志是否一样。 好啦,我们再一起回顾一下,动态规划专题中我们都讲了哪些内容。 ## 动态规划基础 * [关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html) * [动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html) * [动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) * [动态规划:使用最小花费爬楼梯](https://programmercarl.com/0746.使用最小花费爬楼梯.html) * [动态规划:不同路径](https://programmercarl.com/0062.不同路径.html) * [动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html) * [动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html) * [动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html) ## 背包问题系列 背包问题大纲
* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) * [动态规划:分割等和子集可以用01背包!](https://programmercarl.com/0416.分割等和子集.html) * [动态规划:最后一块石头的重量 II](https://programmercarl.com/1049.最后一块石头的重量II.html) * [动态规划:目标和!](https://programmercarl.com/0494.目标和.html) * [动态规划:一和零!](https://programmercarl.com/0474.一和零.html) * [动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) * [动态规划:给你一些零钱,你要怎么凑?](https://programmercarl.com/0518.零钱兑换II.html) * [动态规划:Carl称它为排列总和!](https://programmercarl.com/0377.组合总和Ⅳ.html) * [动态规划:以前我没得选,现在我选择再爬一次!](https://programmercarl.com/0070.爬楼梯完全背包版本.html) * [动态规划: 给我个机会,我再兑换一次零钱](https://programmercarl.com/0322.零钱兑换.html) * [动态规划:一样的套路,再求一次完全平方数](https://programmercarl.com/0279.完全平方数.html) * [动态规划:单词拆分](https://programmercarl.com/0139.单词拆分.html) * [动态规划:关于多重背包,你该了解这些!](https://programmercarl.com/背包问题理论基础多重背包.html) * [听说背包问题很难? 这篇总结篇来拯救你了](https://programmercarl.com/背包总结篇.html) ## 打家劫舍系列 * [动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html) * [动态规划:继续打家劫舍!](https://programmercarl.com/0213.打家劫舍II.html) * [动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html) ## 股票系列 股票问题总结
* [动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) * [动态规划:本周我们都讲了这些(系列六)](https://programmercarl.com/周总结/20210225动规周末总结.html) * [动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html) * [动态规划:买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html) * [动态规划:买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html) * [动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html) * [动态规划:本周我们都讲了这些(系列七)](https://programmercarl.com/周总结/20210304动规周末总结.html) * [动态规划:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html) * [动态规划:股票系列总结篇](https://programmercarl.com/动态规划-股票问题总结篇.html) ## 子序列系列
* [动态规划:最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html) * [动态规划:最长连续递增序列](https://programmercarl.com/0674.最长连续递增序列.html) * [动态规划:最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) * [动态规划:最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html) * [动态规划:不相交的线](https://programmercarl.com/1035.不相交的线.html) * [动态规划:最大子序和](https://programmercarl.com/0053.最大子序和(动态规划).html) * [动态规划:判断子序列](https://programmercarl.com/0392.判断子序列.html) * [动态规划:不同的子序列](https://programmercarl.com/0115.不同的子序列.html) * [动态规划:两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html) * [动态规划:编辑距离](https://programmercarl.com/0072.编辑距离.html) * [为了绝杀编辑距离,我做了三步铺垫,你都知道么?](https://programmercarl.com/为了绝杀编辑距离,卡尔做了三步铺垫.html) * [动态规划:回文子串](https://programmercarl.com/0647.回文子串.html) * [动态规划:最长回文子序列](https://programmercarl.com/0516.最长回文子序列.html) ## 动规结束语 关于动规,还有 树形DP(打家劫舍系列里有一道),数位DP,区间DP ,概率型DP,博弈型DP,状态压缩dp等等等,这些我就不去做讲解了,面试中出现的概率非常低。 能把本篇中列举的题目都研究通透的话,你的动规水平就已经非常高了。 对付面试已经足够! ![](https://kstar-1253855093.cos.ap-nanjing.myqcloud.com/baguwenpdf/_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE_%E9%9D%92.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 这应该是全网对动规最深刻的讲解系列了。 **其实大家去网上搜一搜也可以发现,能把动态规划讲清楚的资料挺少的,因为动规确实很难!要给别人讲清楚更难!** 《剑指offer》上 动规的题目很少,经典的算法书籍《算法4》 没有讲 动规,而《算法导论》讲的动规基本属于劝退级别的。 讲清楚一道题容易,讲清楚两道题也容易,但把整个动态规划的各个分支讲清楚,每道题目讲通透,并用一套方法论把整个动规贯彻始终就非常难了。 所以Carl花费的这么大精力,把自己对动规算法理解 一五一十的全部分享给了录友们,帮助大家少走弯路,加油!