dp总体思想
对于每一步决策,都列出各种可能的局部解,根据判断,舍弃一定不能得到最优解的局部解,在每一步都经过筛选,以至于每一步都是最优解来保证全剧最优解
动态规划多用于最优化问题,关键是存储子问题的每一个解,以备它重复出现
最优化问题第一反应:贪心或者dp
能采取dp的条件:
- 问题中的状态必须满足最优解原理
- 问题中的状态继续满足无后效性原则
无后效性:下一时刻的状态只与当前状态有关,与当前状态之前的状态无关,当前的状态是以往状态的总结
递归
解决斐波那契每一步都需要重复计算:用空间换时间
比如f5已经计算,令dp5等于f5,后期运营时,如果dp5不等于0就直接拿来用
重叠子问题
如果一个问题可以被分解为若干个字问题,并且这些字问题会重复出现,就称这个问题拥有重叠子问题
一个问题必须有重叠子问题才能运用dp来解决
数塔问题
问最大和
此问题对于贪心算法(每一步局部最优解不正确)
思路:a的二维数组存储数塔的每一个数字
dp数组记录计算过程
重叠子结构,下一层计算与上一层直接联系,每一层的数字都是
最优子结构,本层只与上层有关,与上上层无关:上一层谁大就加谁
后无效性原则
状态转移方程
最大值只需要比较dpn就可
把数塔从居中对齐换位左对齐
从上至下推
从下至上推
最优子结构:
状态转移方程
如果一个问题的最优解
dp前提:重叠子问题和最优子结构与后无效性原则
最大连续子序列和
枚举n的三次方
符合重复子问题
最优子结构是什么
第二次课
稍微有点困惑,不过后来想明白了
需要求一个连续子序列,最终结果在ans和dp里面比较大小。dp是当前数值与前一个加上当前数值比较大小。我的担心是,如果8,9,-1,40这样。但是懂了,dp是最优选择,这里两个单独的ans,17与40
关于何时开始,何时结束
开始:ans大于0,设为start
结束:dp大于maxn时候记下???
dp同时记录end与ans
最大子矩阵
每一行都映射到一个b数组,就一行的话,等于最大子序和
两行的话,两行相加合并为一行的矩阵
2,23,234,2345都映射到b数字
最长不下降子序列和
dp数组记录这个过程
前面没有比当前数字小,dp为1,接着2,3,4
最长公共子序列
拓展:最大公共子字符串是什么
硬币问题