DP总结
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问题的解决思路是从下往上,所以它依赖于前面的结果,那么在计算之前,就需要进行状态方程状态初始化。
以下是剑指offer中经典DP问题:
最长不含重复字符的子字符串 https://blog.csdn.net/L_smartworld/article/details/106380228
连续子数组的最大和 https://blog.csdn.net/L_smartworld/article/details/106397397
礼物的最大值 https://blog.csdn.net/L_smartworld/article/details/106379498
把数字翻译成字符串 https://blog.csdn.net/L_smartworld/article/details/106374316
n个骰子的点数 https://blog.csdn.net/L_smartworld/article/details/106353975