dp总结
线性dp
特点:由已知的子问题递推过来,是有方向性的,且有明显的维度。
求解过程:定义dp -> 确定目标 -> 寻找转移方程 -> 考虑优化(有些题不需要)
怎么确定转移方程:考虑两种思考方式:1.如何得出一个状态 2.已知这个状态怎么推其它状态
时间复杂度:直接根据for来乘计算即可
相关题目:
1.基础求LIS
变式1:把一个序列变成非严格递增序列,最少变动的数的个数
长度-最长不下降子序列长度
变式2:把一个序列变成严格递增序列,最少变动的数的个数
长度-最长不下降子序列长度
但是不是对原序列求最长不下降子序列,而是将a[ i ] - = i 后再求!!!
原因:不减会导致最后修改成非严格的序列了,减了后保证了严格单增
2.Making the Grade(POJ3666) 离散化+dp优化
储存最优值优化:这是在dp中常用的优化。
适用对象:决策集合只增不减的情况。
优化过程:每次用一个临时变量储存一下最优值 ,更新的时候直接用 ,而不是for一遍寻找,当更新完一个dp ,又将最优值更新。
重点在于如何定义dp,用储存最优值优化
数位dp:
其实打好dfs的模板就可以走遍天下了
时间复杂度:每一种状态只会遍历一次
套路:求区间满足条件的数的个数:solve(r)-solve(l-1)。写一个solve函数,处理放进来的数,写一个dfs,统计一下方案。
dfs函数:将一些必须的限制传参,压入dp的维度里。pos记录填到第几位了,lim记录是否压了上界,zero记录是否有前导0(在可以抵消的情况下也可以不考虑)。
然后根据是否压上界确定枚举这一位数填的范围,最后通过记忆化搜索的记录保证不会重复搜索。