动态规划基本模型
一:多阶段决策过程的最优化问题
二:动态规划的基本概念和基本模型构成
1.阶段与阶段变量
2.状态与状态变量
3.决策,决策变量,决策允许集合
4.策略与最优策略(思维核心)
5.状态转移方程(代码核心)
三:最优化原理和无后效性原则
1.最优化原理:
最优解只是取决于局部最优,与非最优解关系不大
2.无后效性原则:
现在做的事情不影响以前做的事情,则从此阶段以后过程的发展变化仅与此阶段的状态有关,而与过程在此阶段以前的阶段所经历过的状态无关
四:基本动态规划模型的应用
1.数塔问题
(1)题目
(2)思路
a.爆搜:从第一个开始搜索,一直深搜到数塔的底端,最后一次返回值给顶端
b.记忆化搜索:记录每一个走过的点,再把返回的值储存在一个record数组中,下次遇到record数组,只要有记录,直接返回
c.Dp(顺推):状态转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
Dp(逆推):状态转移方程:f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];
(3)伪代码
a.爆搜
b.记忆化搜索
c.Dp(顺推)
2.最长不下降子序列
(1)题目
(2)思路
朴素算法 n^n
单调性优化 nlogn (dalao详细链接)
a.注意怎样输出路径,将一个c数组(需要额外开容量为N),将c[i]定位此时的队列位置,输出的时候从最后开始扫,如果c[i]=len输出,len--,一直到len为0,此时保证了更新的位置到最长不下降子序列的序列尾端的一段没有被漏掉,而是将更 新的位置往后的(注意不是标准长度的队列,只是有拓展)直接踢掉,例如数据 7 9 16 38 49 10,按照策略应该是 7 9 16 38 49 但是更新完的f数组则是 7 9 10 38 49 则不能直接串联输出,需要用数组标记,这样会自动过滤后面的,有点优秀哈,参考这个dalao
(3)优化:如上单调性优化nlogn
(4)伪代码
3.最长公共子序列
(1)题目
(2)思路:
设置状态f[x][y]为截止到s1的x位置与s2的y位置,此时最长的公共子序列,对于s1[x],如果不在最长公共子序列中,则f[x][y]=f[x-1][y],对于s2[y],如果不在最长公共子序列中,则f[x][y]=f[x][y-1],如果s1[x]==s2[y],那么f[x][y]=f[x-1][y-1]+1,三者之间取 max(只不过后者要满足s1[x]==s2[y])
(3)特殊情况优化
a.题面:
b.思路:首先按照一个规则将第一队列转为顺序储存,再按照同一规则处理第二队列,此时二队列原有关于最长公共子序列的性质任然没有变,又因为第一队列是顺序的,则第二队列只要是顺序的子序列就是公共子序列,问题转换为第二队列的最长上升子序列
c.伪代码
· (4)伪代码
(5)变形
最长上升公共子序列:首先想到的n4方的简单Dp,用f[i][j]代表为s1截止到i,s2截止到j,此时的最长上升子序列的长度,此时只需要s[i]==s[j]s[h]==s[k],s[i]==s[h].s[j]==s[k]在h,k中寻找一个最大的条件。
优化:在处理两个字符串相同的时候,就进行处理,如果不相同,就继承以前的f[i][j-1],再到f[i][j-1]中搜寻最大的,再返回到前面。
未完待续~~~