基础知识:
dp问题归根结底是寻找规律,总结出在各种不同情况下的数学表达式。是一种自下向上的设计,先解决子问题,然后将所有子问题的解决方式联合起来,最终解决问题。一般的思维步骤如下:
1.判断是否为DP问题。两个条件:1.最优子结构;2.重叠子问题。解释下两个条件的含义,最优子结构指的是在计算f(n)的时候,f(n-1)子结构已经达到的题目要求的最优状态。重叠子问题是指在解决f(n)的时候,需要用到f(n-1)的结果。
2.写出状态转移方程。这个步骤是DP问题的灵魂所在,不要想着一下子去解决整个问题,首先冷静分析一下某一个小问题遇到的所有情况是怎样的,分析清楚之后,将其描述成数学表达式,一般使用f(n)函数来表示当前状态。利用f(n)将前面解决的问题结果和当前结果联系起来。编写状态转移方程。(因为总结状态转移方程其实是一个填表的过程,先建立一个表格,然后按照表格来总结状态转移方程,一维的容易直接看出来,二维的肯定是要建立表格分析)
3.第三步也蛮重要。根据状态转移方程选择某种数据结构。一般选的比较多的是一维和二维数组,不是绝对的,还有些需要选择多种数据结构进行辅助,例如剑指offer “最长不含重复字符的子字符串”这道题,需要一个普通变量以及哈希表进行辅助。要根据具体转台转移表达式以及题目需求进行选择。
4.第四步也很重要。因为DP问题的解决思路是从下往上,所以它依赖于前面的结果,那么在计算之前,就需要进行状态方程状态初始化。
下面是力扣1-150中的动态规划题:
博客连接:
3.无重复字符的最长子串:https://blog.csdn.net/L_smartworld/article/details/106496478
53.最大子序和:https://blog.csdn.net/L_smartworld/article/details/106958590
62.不同的路径:https://blog.csdn.net/L_smartworld/article/details/107160706
63.不同的路径II:https://blog.csdn.net/L_smartworld/article/details/107162108
64.最小路径和:https://blog.csdn.net/L_smartworld/article/details/107163384
70.爬楼梯:https://blog.csdn.net/L_smartworld/article/details/107184985
91. 解码方法:https://blog.csdn.net/L_smartworld/article/details/107341764
115.不同的子序列:https://blog.csdn.net/L_smartworld/article/details/107467850
120.三角形最小路径和:https://blog.csdn.net/L_smartworld/article/details/107492973
剑指offer:
46题:把数字翻译成字符串:https://blog.csdn.net/L_smartworld/article/details/106374316
60题:n个骰子的点数: https://blog.csdn.net/L_smartworld/article/details/106353975