dp 小练
选一些 dp 题做一做。随便写一些总结,DP 的具体过程和实现很简略,重在逻辑链的推导。代码可以去原题解下学习。
随缘更新。未完结。
upd:开始杂题训练,停更。
再 upd:开始 whk 了,彻底停更了 /kk。
[HAOI2011] Problem a
考虑转化题意,求最多的说真话的人。
注意到如果有
将区间视作一条线段,然后把 std::map
可以
小陷阱:如果有超过
[CF605E] Intergalaxy Trips
厉害的题目,体现了遇到思维瓶颈时尝试筛除无用状态的思想。
设
注意到,对于边
剩下的有效
[AGC024E] Sequence Growing Hard
最直接的想法是往
因为加数的情况太多,限制很复杂,遇到这种情况,考虑正难则反,删掉
似乎这种正着做限制很强的题都可以反着做(?
然后考虑删掉
这个限制很不错,适合 dp。
设
有:
转移方程的含义可以来 这里 找。
然后预处理一下就可以
[AGC040E] Prefix Suffix Addition
一开始想直接把序列差分,属于是属于是了。
注意到加数不好搞,我们换成减数,方便思考。
然后你会发现这个前后缀是假的,我们可以任意操作一个子区间。
不太自然的一步:简化问题,考虑只有一个操作的时候怎么办,不妨设其为单调不降。
常见的思考模式:将原序列视作若干段单调不降区间,然后发现最小操作次数就是单调不降区间数,可以用贪心得出。
单调不升时同理。
对于一个序列,肯定有一部分是单调不降操作处理,另一部分使用单调不升,由此发现,我们可以把
这一步感觉比较神仙。关键在于两个操作只和数的大小有关,彼此互不影响。
考虑 DP。设
转移方程:
然后发现,
每次根据
[HNOI2012] 集合选数
学过 MO,发现这个东西直接做除了枚举别无他法。如果考虑图论计数会比较谔谔。
考虑一步神仙转化:构造一个和原命题等价的命题。
发现我们可以写出这样一个矩阵:
1 2 4 8 16 32 ... 3 6 12 24 48 96 ... 9 18 36 72 ... 27 ...
原命题等价于,在这个矩阵中选若干数,且互不相邻的方案数。容易发现两者等价。但是正着构造确实难。
由于一行至多
[AGC002F] Leftmost Ball
一个序列合法,当且仅当任意一个前缀白球数量都不低于其它球的颜色种类,并且总共
直接做的上限感觉也就到
考虑换一种思路,把一种颜色的球一次性放完,为了去重,我们钦定它放在从左往右第一个合法位置。
设
初始状态:
转移方程:
-
放白球:
。 -
放新颜色:钦定一个在最前面,剩下的随便放,即
。
答案
[CF840C] On the Beach
首先发现若
很难理解为什么后面我都会却卡在了这么小丑的一步。
考虑容斥原理,算有不合法相邻的方案数。
经典 dp 模型,先考虑一段:设
段与段之间可以加法卷积,类似树形背包,时间复杂度
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期