leetcode-master/problems/动态规划总结篇.md

139 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>