DP 优化
1|0DP优化
一些典型或者不典型的 DP 优化实例。
1|1CF354D Transferring Pyramid
题意:有一个
思路:定义
复杂度
trick:根据题目中的条件分析实际有用的范围,优化状态量。
1|2P3506 [POI2010]MOT-Monotonicity 2
题意:给定长为
思路:一开始的想法有点接近正解,不过还是差不少。首先,可以大胆猜想,以
设
既然证明了满足最优子结构,就说明每次可以选择合法的最大答案,可以直接用树状数组维护。
trick:最优子结构的体现。
1|3P6564 [POI2007] 堆积木KLO
题意:给定序列
思路:我们记
trick:分析出转移顺序,再按照指定顺序转移会更方便。
1|4P4099 [HEOI2013]SAO
题意:给定一颗树,遍历方向为根到叶子或叶子到根,求遍历方案数。
思路:看到求拓扑序方案数首先想到设
trick:前缀和优化转移。
1|5P7532 [USACO21OPEN] Balanced Subsets P
题意:有
思路:一开始想错了,想到今年 IOI D1T3 去了,后来才发现就是其实是凸多边形。
那么就比较简单了,设
trick:对于转移是从矩形内转移过来,可以用二维前缀和优化。
1|6[AGC007E] Shik and Travel
题意:一颗
你从
每天的路费是你走过的路径上的边权和,你的公司会为你报销大部分路费,除了你旅行中所用路费最高的,行走路线是从叶子到叶子的那一天的路费。
求路费的最小值。
思路:首先,显然可以二分答案。接着就是判定是否合法。设
这样 DP 很暴力考虑怎么优化。我们发现,如果有两个合法状态
trick:如果状态之间存在偏序关系,就可以优化状态量。
1|7P1912 [NOI2009] 诗人小G
题意:把序列划分成若干段,每一段的代价是
思路:
这个
于是可以用二分栈的经典做法来实现,复杂度
trick:决策单调性。
1|8P3571 [POI2014]SUP-Supercomputer
题意:有一棵
思路:首先有结论:记
我们来证明一下为什么是取
发现
1|9P6047 丝之割
题意:有若干条形如
思路:先考虑那些弦不会做贡献,很容易发现如果有两个弦
设
朴素的转移是
trick:斜率优化。
1|10CF1188C Array Beauty
题意:定义一个序列的权值为两个数之差的绝对值的最小值,求长为
思路:首先肯定是对
trick:分析数据范围,斜率优化。
1|11CF1179D Fedor Runs for President
题意:在树上删除一条边后,求最多能形成多少条简单路径。
思路:树上斜率优化。
首先只考虑加一条边后会多出来多少条路径。假设加入的边为
要让答案最大,我们就要选一条路径使
我们设
求出这个后,考虑如何将两条路径合并。先朴素直接枚举两个儿子来转移,即
这样一次转移是
化简后可得
再变形可得
因此当
然后再注意
总复杂度
trick:树上斜率优化。
1|12P4292 [WC2010] 重建计划
题意:求有上下界树上平均值最大路径。
思路:有点分治的做法,感觉长剖比较好写,就来写长剖了。
对于每个点,设
1|13CF671D Roads in Yusland
题意:给定一棵
思路:左偏树优化 DP。
设
trick:如果发现状态中维护的不能只有答案,可以先保留所有对后面有贡献的方案,然后再想办法优化。
1|14CF809D Hitchhiking in the Baltic States
题意:给出
思路:设
考虑转移:
,那么 ,那么 ,那么不变。
暴力转移是
- 用小于
的最大的 转移到 。 - 让区间
内的 +1,然后往后移。 - 删掉大于等于
的最小的数。
trick:如果转移形式简单,可以把相同转移的一起处理。
1|15CF856F To Play or not to Play
思路:考虑一个最暴力的做法,设
考虑怎么简化状态。我们发现,如果状态
考虑现在加入了一个时段,长度是
如果只有 V 在线,那么所有的
如果只有 P 在线,那么所有的
如果两人都在线,那么分 3 种:
,那么会变成 。 ,那么可以让两个人都上线变成 ,或者让 减小到 ,那么会变成 。 ,同上。
考虑用平衡树维护。
对于前两种,就是全局的
对于后一种,我们把平衡树分成
trick:如果状态之间存在偏序关系,可以把被偏序掉的状态去掉,减少状态量;如果转移形式简单,可以把相同转移的一起处理。
1|16CF1630D Flipping Range
题意:给定一个长度为
- 选出一个在
集合中出现过的数 。 - 选择
数组中一个长度为 的子段,然后将该子段里的所有元素的值变为其相反数。形式化地来说,选出满足 且 的两个数 ,然后对于所有的 ,将 替换为 。
你希望最大化
思路:好厉害的题目。
首先,如果
考虑怎么求
记
然后有
证明:记
因为有
然后就可以用分治解决,复杂度
不过可以做到
1|17CF1119F Niyaz and Small Degrees
题意:一棵大小为
思路:先考虑对于每个
然后考虑正解。如果从小到大考虑每个
1|18P1295 [TJOI2011] 书架
题意:给一个序列
思路:首先可以很简单的想到一个
1|19[ARC082F] Sandglass
题意:有一个沙漏,每秒会有 1g 沙子从上面落下来,有
思路:一开始的思路是每个操作形如
其实线性做法的思路也是维护如果一开始是多少此时就有多少,记为 最终值不和上下界(红线)相等的
trick:通过画图分析转移的性质。
1|20P2519 [HAOI2011] problem a
题意:一次考试共有
请求出最少有几个人没有说真话。
思路:发现条件等价于 我是第
如果超过
如果把有多少人的区间是
设
复杂度
1|21P9523 [JOISC2022] 复制粘贴 3
题意:构造长度为
- 输入 c,即
。 - 剪切,将
剪切到剪切板 ,并令 为空。 - 粘贴,即
分别有代价 A,B,C,求得到目标串的最小代价。
思路:设
直接转移复杂度很劣,考虑怎么优化。我们一加上
预处理出 kmp 数组,然后每次跳 next 来转移,这样做是
现在还需快速求出
复杂度
1|22LOJ#6564. 最长公共子序列
题意:求 LCS。
思路:一直没怎么做过bitset科技题。
朴素求LCS的DP是
考虑怎么用 bitset 来进行操作。
令
trick:如果 DP 数组的差分只有 0/1 可以考虑用 bitset 来优化转移。
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18016571.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探