dp总结

dp总结

线性dp

特点:由已知的子问题递推过来,是有方向性的,且有明显的维度。

求解过程:定义dp -> 确定目标 -> 寻找转移方程 -> 考虑优化(有些题不需要)

怎么确定转移方程:考虑两种思考方式:1.如何得出一个状态    2.已知这个状态怎么推其它状态

时间复杂度:直接根据for来乘计算即可

相关题目:

1.基础求LIS

变式1:把一个序列变成非严格递增序列,最少变动的数的个数

长度-最长不下降子序列长度

变式2:把一个序列变成严格递增序列,最少变动的数的个数

长度-最长不下降子序列长度

但是不是对原序列求最长不下降子序列,而是将a[ i ] - = i 后再求!!!

原因:不减会导致最后修改成非严格的序列了,减了后保证了严格单增

2.Making the Grade(POJ3666) 离散化+dp优化

储存最优值优化:这是在dp中常用的优化。

适用对象:决策集合只增不减的情况

优化过程:每次用一个临时变量储存一下最优值 ,更新的时候直接用 ,而不是for一遍寻找当更新完一个dp ,又将最优值更新。

3.LCIS(最长公共上升子序列)

重点在于如何定义dp,用储存最优值优化

 

数位dp:

其实打好dfs的模板就可以走遍天下了

时间复杂度:每一种状态只会遍历一次

套路:求区间满足条件的数的个数:solve(r)-solve(l-1)。写一个solve函数,处理放进来的数,写一个dfs,统计一下方案。

dfs函数:将一些必须的限制传参,压入dp的维度里。pos记录填到第几位了,lim记录是否压了上界,zero记录是否有前导0(在可以抵消的情况下也可以不考虑)。

然后根据是否压上界确定枚举这一位数填的范围,最后通过记忆化搜索的记录保证不会重复搜索。

数位dp总结

状压dp:

状压dp入门(模板题+思维题)

原文地址:https://www.cnblogs.com/mowanying/p/11391374.html