「REMAKE系列」线性dp篇
常见模型、技巧总结
LIS、LCS模型
LIS
- 结论题 [HAOI2006]数字序列
LCS
有趣线性dp
- 定义状态为修改中。 CF1155D
习题
洛谷——「能力综合提升题单-线性DP篇」
P2501 [HAOI2006]数字序列
现在我们有一个长度为 的整数序列 。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。
第一行输出一个整数,表示最少需要改变多少个数。
第二行输出一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值。
- 对于 的数据,保证 ,。数据保证 随机生成。
思路
- 结论题两个结论,数据随机 可以过。
- 对于第一问,构造 ,求 b[] 的最长单调不减子序列长度即可。
- 对于第二问。考虑 b[] 中最长单调不减子序列中的相邻元素下标为 i, j,对应下标之间的大小一定不在 [b[i], b[j]] 之间,否则子序列可以更长。
- 那么对于每一对相邻元素(序列不止一个),最终的结果一定是中间某一个 , 使得
b[i..k] = b[i], b[k+1...j]=b[j]
,这样的结果是最优的。 - 所以对于每一对相邻元素的区间,采用 dp 转移,设
dp[i]
表示处理以下标 为结尾的最长单调不减子序列最小代价 - 枚举分界点 k。判断相邻元素区间合法,在 LIS 时记录每个下标作为末尾对应的最长长度。
- 那么对于每一对相邻元素(序列不止一个),最终的结果一定是中间某一个 , 使得
Codeforces
CF1155D. Beautiful Array
定义三个状态,未修改、正在修改、修改结束了,相互转移即可
CF1446B. Catching Cheaters
- LCS变形,将状态转移代价改为对答案的贡献。
CF666A. Reberland Linguistics
已知有长度为的由小写字母构成的一个字符串, 现在对字符串进行一些操作
- 选择一个长度 的“根”字符串
- 然后在“根”字符串之后连接上任意个长度为2或3的“后缀”字符串。
- 唯一的限制条件是,不可以连续接上两个相同的“后缀”字符串。
现在求构造过程中,有可能被用作“后缀”的字符串共有多少种。多个同样的“后缀”字符串只算一种。
思路
- i 开始接 j 个字符串是合法。
- 从后往前做dp,转移条件是后面相同长度的串 不等且合法 或者 不同长度串合法
CF682D. Alyona and Strings
- 设 表示为 a 串前 i 位与 b 串前 j 位匹配 k 次的最大长度
- 转移简单,但每次转移完需要更新为前缀最大值
CF1183H. Subsequences (hard version)
- 设状态为 前 i 个字符,序列长度为 j 的方案数。
- 转移:
__EOF__

本文作者:Roshin
本文链接:https://www.cnblogs.com/Roshin/p/remake_linear_dp.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Roshin/p/remake_linear_dp.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】