基础线性dp(25.9.27)

基础线性Dp

概述

指在O(n)时间内完成的动态规划算法,最优子结构,无后效性和子问题重叠

一开始搞不懂去怎么证明一些子问题,为什么可以通过转移得到新的解就是最优解,后面通过讲解知道了,因为:dp本质其实是一个表结构,表用作的是子问题的求解与存储,在新问题出现的时候,便开始枚举求解,但是是把所有的子问题直接使用,避免了再次枚举,所以是一个枚举优化,无需证明
所以dp可以理解为,设置一些状态下的子问题,之后去做枚举,使枚举中的时间复杂度小一些,然后求解出新的子问题,最后求出答案

考点条件与思考方向

状态定义的思考

\(阶段划分(找拓扑序) \rightarrow 设计状态 \rightarrow 确定决策 \rightarrow 转移方程 \rightarrow 确定边界 \rightarrow 确定目标\)

  1. 尝试去寻找一个拓扑序,(通过答案性质寻找),在完成一个事情之前必须完成之前的一个事
  2. 觉得一个状态要包含多少信息,才可以让转移简单并且不重不漏
  3. 在满足后面条件的情况下,尽量减少状态蕴含的不必要的信息
    先保证是对的,再想优化
  4. 分组:表示是当前 部分/阶段 的最优解
  5. 先列出分组(非完全最优解,指的是在当前位置 不是完全范围)+ 附带性质最优解,把两个放一块
    本意就是列出不同状态

最优问题求解

考虑是否可以尝试直接 最优解 为dp含义(阶段)

比如设:Dp[x]为在选择a[x]数的时候,最优解

考虑是否可以反向尝试设 最优状态 为dp含义(阶段)

比如设:dp[x]为在答案为x的时候,当前的最优状态
如:dp[x]为,在长度为x的时候,记录是的最优的选择的数,最优状态

考虑是当前为最优向后扩展,或是当前的最优由前面的最优寻找(收集/拓展)

方案问题求解

考虑是否可以分为多个小方案的总和

尝试设dp为所有小方案的最优解,最后把所有答案加起来

考虑是否可以从当前最优总方案转到另一个最优总方案

尝试设dp为至当前范围的最优总方案的最优解,最后转移到最后

计数问题求解

较为特殊的动态规划,实际是运用了状态类型,进行递推

尝试设置不同状态(状态先要完全)的计数结果,再加上状态转移

posted @ 2025-09-27 20:42  Yuriha  阅读(8)  评论(0)    收藏  举报