基础线性dp(25.9.27)
基础线性Dp
概述
指在O(n)时间内完成的动态规划算法,最优子结构,无后效性和子问题重叠
一开始搞不懂去怎么证明一些子问题,为什么可以通过转移得到新的解就是最优解,后面通过讲解知道了,因为:dp本质其实是一个表结构,表用作的是子问题的求解与存储,在新问题出现的时候,便开始枚举求解,但是是把所有的子问题直接使用,避免了再次枚举,所以是一个枚举优化,无需证明
所以dp可以理解为,设置一些状态下的子问题,之后去做枚举,使枚举中的时间复杂度小一些,然后求解出新的子问题,最后求出答案
考点条件与思考方向
状态定义的思考
\(阶段划分(找拓扑序) \rightarrow 设计状态 \rightarrow 确定决策 \rightarrow 转移方程 \rightarrow 确定边界 \rightarrow 确定目标\)
- 尝试去寻找一个拓扑序,(通过答案性质寻找),在完成一个事情之前必须完成之前的一个事
- 觉得一个状态要包含多少信息,才可以让转移简单并且不重不漏
- 在满足后面条件的情况下,尽量减少状态蕴含的不必要的信息
先保证是对的,再想优化- 分组:表示是当前 部分/阶段 的最优解
- 先列出分组(非完全最优解,指的是在当前位置 不是完全范围)+ 附带性质最优解,把两个放一块
本意就是列出不同状态
最优问题求解
考虑是否可以尝试直接 最优解 为dp含义(阶段)
比如设:Dp[x]为在选择a[x]数的时候,最优解
考虑是否可以反向尝试设 最优状态 为dp含义(阶段)
比如设:dp[x]为在答案为x的时候,当前的最优状态
如:dp[x]为,在长度为x的时候,记录是的最优的选择的数,最优状态
考虑是当前为最优向后扩展,或是当前的最优由前面的最优寻找(收集/拓展)
方案问题求解
考虑是否可以分为多个小方案的总和
尝试设dp为所有小方案的最优解,最后把所有答案加起来
考虑是否可以从当前最优总方案转到另一个最优总方案
尝试设dp为至当前范围的最优总方案的最优解,最后转移到最后
计数问题求解
较为特殊的动态规划,实际是运用了状态类型,进行递推
尝试设置不同状态(状态先要完全)的计数结果,再加上状态转移

浙公网安备 33010602011771号