DP 题目合集
3n多米诺问题
矩阵快速幂优化。
CF809D 题解
CF15E 题解
CF17C 题解
CF79D 题解
Walk
有向无权图。求长度
我们发现邻接矩阵的
矩阵快速幂。
NOIP2023 T4 题解
古城之谜
状态定义:
初值:
除了
状态转移:
求
记
注:这里的 pair 取 min 是先按照句子数(first)比,first 相等按单词数单词数(second)比。
-
是辅词, , ; -
是名词, ; -
是动词, 。
但是这太慢了,我们发现,枚举上一个单词的结尾时,我们不需要重新循环一遍组成单词来判断,我们可以使用 Trie 来优化这个操作。只需要把所有单词倒着插入 Trie 中,我们就可以利用 Trie 快速检查一个单词是否存在。
还要注意几个问题,我们的转移可能会导致最后一个句子里面不是名词开头,对此我们的应对方法是:枚举最后一个单词,如果是动词,就用前面的 dp2 加一个单词更新答案;如果是名词,就用 dp1 加一个单词更新答案。
知识点:
用 pair 数组 dp,可以同时记录两个答案
Trie 优化
铁球落地
先按照高度从矮到高把所有平台排序。
状态定义:
初值:
除了
转移:
因为
枚举
但是这太慢了,考虑优化。
我们发现,枚举
具体而言,我们计算完
当然,这也意味这我们需要离散化每个平台的左右端点坐标。
可以这么做的原因,是我们按照高度排序了,所以如果一个平台上方有另一个更高的平台,被更高平台覆盖的部分一定不会被落到。
答案还需要处理一下,因为我们没有算小球一开始下落和滚动的时间。
线段树优化
奶牛集合
换根 DP
物流运输
保安站岗
树形DP,
保安站岗弱化版
Arrays
这题蓝属实过分了吧(
AT_dp_x
先用贪心得知
然后 dp。
Mice and Holes
显然一个洞只会容纳连续的一段老鼠。把老鼠和洞都排序。
发现当
这样就可以单调队列优化。
POJ2288:
题意:给定图带点权。找一条哈密顿路径权值最大。一条路径的权值定义:设路径为
解法:状压 dp,
关于三个点的 dp,一般可记录上一个和当前的,枚举下一个的时候统计。
EST
题意:给定一个序列
显然一段内的
考虑
枚举第
其他部分
求
把
则
其实我们只需要知道
那如何快速求
Tower of Hay 与题解
绝世好题(只是叫这个名字而已)
部分分显然就是
在状态定义上面优化(这种优化一般比较巧):
初始值全部设成
转移的时候,先让所有
262144
第一眼的想法肯定是区间 dp,但是这题不仅碍于数据范围,而且用区间 dp 也不知道两个子问题区间的长度。
既然不知道区间长度,不如直接设成
状态定义:
初值
感觉有点像倍增了,这个转移方程正确吗?
要合成出
定义范围
Sue 的小球
类似的题:关路灯
最大价值 = 总价值 - 最小损耗
20个问题
注意本题的多测
预处理一个
目标状态:
递推:若
集合选数
巧妙!
构建一个方格图来描述这个不能选的关系。对于每个数抽象为一个方格,它乘三代表的数在它右边,它乘二代表的数在它下面。于是就构造出了若干个方格图。
题目的条件等价于相邻格子不能选。
由乘法原理,我们只要求出每个方格图的方案数再乘起来就行。
而对于单个方格图,可以状压 dp,是个经典模型。
Max Correct Set
结论:一定存在一个最优解,满足如果
有了这个结论就能直接状压了。配合上:环形,不停 + x,如果超过 y 就 - y 这个理解。可以变成
注意处理
给定
前缀和。
分两半
给定一个序列,判断是否能通过删除若干数使得整个序列不能分成和相等的两半。
先用可行性背包 DP 出一开始能不能分成和相等的两半——如果不行,就不用删。
否则,我们考虑到如果总和是奇数,肯定不能分成两半。所以尝试删除一个奇数。而如果全部都是偶数,我们将每个数都除以二,递归再看。
2×m 哈密顿路
给定一个
初始在
玩家
你要打怪兽了,有
有
只要
鉴于
递推:
构造 1~5
给定序列
-
。 -
若
, 。 -
若
, 。 -
若
, 。
可行性 DP:
删数位
给定一个长度
考虑每一位的贡献。如果被删了,肯定没有贡献。所以贡献可以分为:只删前面 和 只删后面。
只删前面:很简单,这一位的贡献始终不变,前面共有
只删后面:容易用递推的方法做。
倍增
给定长度
若最后
求最大收益。
首先可以
然后就变成01背包模型。但是这样是
进一步观察,其实上涨的幅度很快,根本用不到
抢救
给定
这题很像 建筑抢修,区别是物品有各自的拯救价值。但关键点都是:按物品死亡时间升序排序。
排完序就是 DP 了。
覆盖
题意:给定一个颜色序列。要选定一个位置
很自然的想法就是区间 DP,
初值
若
同时
注意:这么写是对的,因为是选定一个位置不停改。
完成任务
有
有
判断是否能让每个任务完成。并且可以的话,输出执行计划的方案。
明显看出可以把所有任务按照
对于一个任务,我们的问题变成:有
这不就是 01背包 吗 ?但是
回文串判断
给定字符串,求出
可行性DP:
回文串计数
给定字符串,求出有多少个不相交的的回文子串对。
和上一题一样,
对
枚举所有回文串
祖玛
给定一个字符串,每次可以挑一个回文子串删除,剩下的会拼起来。问最少删除几次可以删光。
初值:
递推:若
同时任何时候,
括号涂色
给定一个匹配的括号序列,每一个括号可以不涂色或者涂两种颜色之一。每一对匹配的括号恰好有一个要涂色,相邻两个括号不能涂同色。求方案数。
倒水
有
对于
显然当我们选定之后,要尽量从没选的杯子往选了的杯子里倒水。
记原本总水量为
则最终的答案是
因此我们要让
初值
清除字符串
题意:每次可以删除一个字符块,求最小操作次数删完。
异或
给定一棵树,每个点有 0/1 的点权。第
一个时刻
观察到,第
定义
显然对于节点
假设某时刻
将一个使得
既然这里有
因此我们用 DP 求出
补括号
给定一个长度
预处理
然后枚举放在左侧的括号序列长度、左括号比右括号多的数量。
乘一下累加即可。
路径
给出
求出一条任意起点、途中不能经过之前走过的点,并且包含
边
走一条边,就会把能走的区间分开。考虑
初值:
递推:适合刷表法。
答案:
注意是开区间。
角斗场
有
现在要你指派每个人的初始血量,要求在
若
否则,枚举剩下的人的个数,并且此时剩余最大血量为
极差
给定序列
观察发现,最后一个位置必然是最大值或者最小值。
于是对
二叉树
求
初值
递推
答案
蚂蚁
一个数轴的正半轴上有
有一只蚂蚁在
问蚂蚁走到
观察:当蚂蚁位于
答案是
字符串涂色
给定一个字符串,你要将每个位置涂色。如果两个相邻位置不同色,就可以交换这两个位置的字符。问最少涂多少种不同的颜色,可以使经过若干次交换后字符串升序排列。
升序排列:和逆序对有关。
即对于
令
Star MST
叛徒
结论:
-
最坏情况肯定是初始叶子结点变成叛徒。否则下移更优。
-
最终叛变的是一颗子树。
令
从简单情况考虑:若
(要么
而若
Black and White Tree
首先考虑链上的情况。发现 A 可以放在第二个位置,此时 B 必须放在第一个位置。然后问题规模 -2。
到树上,如果存在一个结点,有
先手下在
(这只是略证)
Subtree
树形 DP + 前后缀积优化。
Book of Evil
树形 DP 求出
三边
必然是一条直径 + 到直径最远的点。
先找出一条直径,再从直径上每个点向直径外搜索。
Neko Rules the Catniverse
给定
- 任意两个元素其权值不同。
- 对于任意
满足 有 。 - 对于任意
满足 有 。
答案对 取模。
正常想法是按照
所以我们尝试按照从大到小的顺序 DP,相当于往一个序列不断插入更小的数。这样子可以保证插入顺序和数的大小顺序都有。
容易发现,保证每次插入后都合法的操作序列 与 原本的序列 可以一一对应。
一个简单的想法是
然后可以
但是
Petya and Arrays
按照数组顺序 DP 难做。
考虑另一个数组
而限制转移到
-
; -
各不相同。
观察到如果构图
于是可以改换枚举顺序:按照环枚举。基础想法
因为环的个数可能比较多,也需要矩阵快速幂。
Colorful Maze
注意到受伤两次就死,所以我们实际只需要一个变量来记录目前已知的危险颜色——如果知道了两种颜色是危险的,必定死了不合法。
但是安全格子是需要记录的,可以采用状压。
转移时枚举与它相邻的位置
-
是终点,胜率为 。 -
是已知的危险颜色或者障碍物,胜率为 。 -
是已知的安全颜色,胜率为 。 -
是未知颜色。胜率为 。
然而还有一个问题:DP 顺序。这其实用记忆化搜索就行了,从终点开始。
寿司晚宴
两个人各从
选一个子集,要求从这两个子集里各任意选一个数,都必须是互质的。允许空集。求方案数。 。
容易想到要记录两个子集各自包含哪些质因数。对于
思考发现,其实对于
发现除了特殊一类,每一类内的数都不可能存在两个数分给两个人(所有数要么不选,要么只会属于一个人)。那它们对答案的贡献可以直接搞个快速幂求出来,我们还是只需要处理特殊一类。而这一类不包含大质数,沿用上面状压 DP 的方法即可。
Mx 的组合数:UOJ86
看到
数位 DP 都是从高到低的。
但是这个复杂度是
取
这个时候我们发现如果从
还有一个要注意的就是
因此复杂度降低为
poj1090:Chain
观察发现,操作序列构成格雷码。而且每个操作序列都会先走到
反过来求
发现按照这种格雷码,就是最优操作序列。问题变为给定一个二进制数求在格雷码中的排序。
这里有一个数学结论:第
推论:把
反推可得
TopC13457:BoardFolding
给定一张方格表,每个格子有不同的颜色。可以沿着格子线横着折或者竖着折,要求必须是小的那边折到大的那边,而且折叠对应的位置必须颜色相同。问任意次操作之后可以得到哪些子矩阵?
一个基础的想法是求一个
这里观察到一个性质:横着折和竖着折之间是独立的,也就是判断
那么只用求
到这里可以通过原题,但是我们还能继续优化!
观察到
具体考虑怎么 DP,这里只描述
首先初值
求回文半径可以用 manacher 预处理。
如果直接 DP,还是
GYM100286C:Clock
就是给定一个很多根针的钟和之间的联动关系,求从
首先发现可以把问题转化为从
把针
所以我们说
于是给每个
因为从高位到低位没有影响,因此如果我们从高到低 DP 就是无后效性。粗略的想法是
但这是不行的,因为
好像卡住了?
仔细思考,
于是得出结论:当
修正表达式
题意:给定三个数
考虑把最终的
转移时枚举
CF710E: Generate a String
初始一个
一个
注意到
所以等价于三种操作:
AGC012E: Camel and Osase
给定
现在有一个人在沙漠中进行旅行,他初始的背包的水容积为
对于每一个 Possible
,否则输出 Impossible
。
容易观察到每次跳跃后水量折半,跳跃次数不会太多,一共
因此可以预处理出
看作
用状压 DP 实现,
直接暴力判断答案,就是枚举
但是这样是
于是留下
TopC10664: RowGame
题意:给定长度
容易发现,最理想情况下我们肯定是选择一个和很大的区间来回走。进而我们不难猜出路径的形式:找到一个区间,反复刷分直到足够走到下一个区间,然后去下一个区间继续刷分 …… 直到不够次数向后走了,就停下来刷分。
严格来说,假设最优路径会选择
-
。
这显然,不然没有必要去新区间。
由此推导出每个区间的和都是正的,因为走第一步要求非负,所以第一个区间是正的,后面的区间都大于前面的。 -
且 为使得 最大的 。
后半部分很显然。记使得 最大的 为 。前半部分,反证法,则
。
当 ,因为 ,所以 ,则 ,矛盾。
当 ,同理得到 ,有 ,矛盾。
当 ,因为区间分数递增,所以 ,那没必要去 ,直接去 即可。 -
当
时, 。
反证,当 时,因为 ,所以 ,则 ,矛盾。
当 ,因为分数递增,所以 ,也没必要去 ,因为不刷分也可以直接走。
当 ,因为 ,所以 , ,矛盾。 -
最优解总是用最少步数走到新区间。
如果不用最少步数,说明前面浪费了一步刷分。但前面刷分不如刷新区间的分,新区间的分一定比前面的更大。
CF111C:Petya and Spiders
观察发现,蜘蛛的最优行动肯定是若干个 "十",每个十字覆盖区域的蜘蛛都集中到中心点。
所以只要求出最少用多少个十字覆盖整个网格图,
因为
初值设定,枚举第
转移时枚举第
答案为
CF678E:Another Sith Tournament
正向 DP 不好做,考虑
答案就是
方块消除
题意:给定一行方块,带颜色。每次选择一个颜色段消除,剩下的方块再拼起来。一次消除如果消了
最初想法是
拼起来的目的是让一段后面增加和它同颜色的方块。考虑升维
转移方程怎么写?对于
-
不参与和其他段的合并,直接自己消除:从
转移来。 -
参与和其他段的合并,枚举是和哪一个段
进行第一次合并:从 转移来,这种情况要求 。
因此
还有一个问题:
CF1392D:Okmar and Bed Wars
观察发现,若
所以合法
先考虑在链上的情况。对于链,容易想到把每一段相同指向的分开。设一段的长度是
在环上的大部分情况,按照链的情况也是对的(每一段相同的长度除以三求和),但是我们发现当整个环的指向都相同的时候,需要
如何处理环上首尾同向但是无法统计的情况?把
DP 做法:
最终合法状态一定是由
但是在环上,旋转后也合法。因为 DP 第一次决策最多涉及前四个位置,把
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!