<p align="center">
<a href="https://www.programmercarl.com/xunlian/xunlianying.html" target="_blank">
  <img src="../pics/训练营.png" width="1000"/>
</a>
<p align="center"><strong><a href="./qita/join.md">参与本项目</a>，贡献其他语言版本的代码，拥抱开源，让更多学习算法的小伙伴们受益！</strong></p>


# 动态规划最强总结篇！

如今动态规划已经讲解了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)

## 背包问题系列

<img src='https://code-thinking.cdn.bcebos.com/pics/动态规划-背包问题总结.png' width=500 alt='背包问题大纲'> </img></div>

* [动态规划：关于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)

## 股票系列

<img src='https://code-thinking.cdn.bcebos.com/pics/股票问题总结.jpg' width=500 alt='股票问题总结'> </img></div>

* [动态规划：买卖股票的最佳时机](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)

## 子序列系列

<img src='https://code-thinking.cdn.bcebos.com/pics/动态规划-子序列问题总结.jpg' width=500 alt=''> </img></div>

* [动态规划：最长递增子序列](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花费的这么大精力，把自己对动规算法理解 一五一十的全部分享给了录友们，帮助大家少走弯路，加油！


<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
  <img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>
