
DP
文章平均质量分 71
动态规划
SHOHOKUKU
这个作者很懒,什么都没留下…
展开
-
LeeCode 1987 DP / Trie
用Trie维护子序列集合,树中每一个节点代表一个互异的子序列。维护Trie中子树数量小于2的节点数量,不断插入新元素,同时将新增的树节点计入答案。,则枚举子序列的第二个元素。为首元素的子序列集合为。进行转移,转移的位置是。原创 2024-06-15 22:28:32 · 882 阅读 · 0 评论 -
LeeCode 1787 DP
个元素,则可以从任一个状态转移过来,那么贪心地选择改动数量最少的状态即可。对于出现在同余类中的取值,直接暴力枚举即可。意义下索引相等的各个元素相同,故可以依次处理每一个同余类。情况下的最小更改元素数。直接枚举每一种取值,时间复杂度。的区间产生影响,故难以直接依次处理每一个元素。观察到满足条件的数组中模。原创 2024-06-04 23:03:08 · 1136 阅读 · 0 评论 -
Codeforces 1955H 最小费用流 / DP
新增源点、汇点,将带权二分图建模为网络流,构造势函数保证边权非负,使用dijkstra算法不断增广。而此处的图具备良好的性质,即每次增广所用的边数。那么对于流量任意的最小费用流,只需在残余网络存在权值为负的路径情况下不断增广。为左右节点构造带权二分图,问题转化为求匹配数任意情况下的最小权匹配。,则塔对敌人造成的伤害与初始化增加的生命值两者的总贡献为正,此时显然取。都是相等的(不妨假设增广路中每条反向边可以抵消一条原边),即。不同塔对敌人的贡献是独立的。的攻击范围,则其对敌人的造成伤害的上界为。原创 2024-05-02 11:06:22 · 732 阅读 · 0 评论 -
LeeCode 3130 DP / 组合数学
可以通过维护前缀和,或者直接利用递推关系作差分,优化掉枚举序列长度这一维。如下采用维护前缀和进行优化,时间复杂度。0/1子段可以分别独立地统计满足条件的序列数量,最后相乘即可。以0为例,假设其子段数量为。那么只需要暴力枚举每一段连续且元素相同的序列长度,递推即可。可以通过枚举连续的0/1的子段的数量统计答案。具体而言,令0的段数量为。,则每一段至少需要分配一个0。故剩余可自由分配的0数量为。,因为0/1子段是交错的,故1的段数量仅有。个桶且每个桶的元素数量不大于等于。的方案数,可以通过容斥原理。原创 2024-04-29 23:15:35 · 670 阅读 · 0 评论 -
LeeCode 1896 括号树 + 树形 DP
根据布尔表达式建立一颗括号树,具体而言,出现嵌套括号就新增一个虚拟子节点。建树过程可以用一个栈维护。此括号树满足各个节点的子节点集合是按照计算顺序排列且可以直接计算的节点。最后在树上以表达式取值为状态进行树形DP即可。原创 2024-03-16 11:28:08 · 450 阅读 · 0 评论 -
LeeCode 546 区间 DP
不在同一轮被移除,则可以枚举分界点更新答案;反之,则难以直接递推。在同一轮被移除的元素数量即可。难以顺序处理,故考虑不断拓展区间。原创 2024-02-16 22:28:25 · 846 阅读 · 1 评论 -
AtCoder ABC 328G 状态压缩 DP + 复杂度分析
另一种方案是枚举分割的段,此时每一个连续的段(除了起始段)操作 1 贡献是。的位置,都至少要分割一次,且仅需这样的分割就可以得到。容易想到两类计算分割贡献的方案。实际上,这是一个宽松的界,对于每一个段的长度。不考虑分割贡献,则需要维护两个变量:集合。,对于每一个状态,可能的段规模为。实际上,只需要维护前者,因为。经过操作 1 变换为排列。,实际上对应的状态数为。,转移时可以直接判断。原创 2024-02-15 22:14:47 · 946 阅读 · 0 评论 -
Codeforces 1855E 数学期望 + DP
根据数学期望的线性性质,可以独立地考虑每一个。的情况看作后者消失,则。对答案的贡献,则答案为。原创 2023-11-02 23:02:48 · 339 阅读 · 0 评论 -
Codeforces 1856E2 复杂度分析 + DP
具体做法类似于二进制拆分,不断将相同的值合并,最终每一个不同的值仅有常数个,则不同的值数量为。那么需要在值域上将子树的节点左右划分,那么需要求解所有子树的子集中,子树规模。考虑最坏情况,即平衡的多叉树,容易观察到所有背包 DP 的复杂度为。的每一棵子树,其所有节点在最优情况下仅有。可以独立考虑每一个固定的。的和最接近所有子树和的。对于上述背包问题,满足。原创 2023-08-17 19:24:09 · 146 阅读 · 0 评论 -
Codeforces 461B 树形 DP
的联通分量是否存在一个黑色节点 ,同时其余联通分量仅包含一个黑色节点情况下,划分方案的数量。DFS 求解,对于每一条连向子节点的边,考虑是否删去这条边,进行状态转移即可。为根的子树中,包含了。原创 2023-08-17 15:33:36 · 101 阅读 · 0 评论 -
HDU 6391 组合数学 + DP
异或进来后,异或和为 0 和 1 的数量,对应的贡献为。,这些数字异或和中 1 的数量为。之前出现过的情况,对应的贡献为。可以为任意数字,那么要从。的排列,最后答案除以。原创 2023-07-31 21:05:22 · 174 阅读 · 0 评论 -
Codeforces 1579G DP / 二分 + bitset
用 std::bitset 维护当前的可能位置,初始位置可能位于。时,覆盖区域的最小值。枚举左右方向递推即可。次移动后所在位置与覆盖区域最左侧位置相差。中的任一个位置,递推即可。原创 2023-07-29 17:42:07 · 299 阅读 · 0 评论 -
Codeforces 1828E Manacher + DP
表示为唯一的分割形式。Manacher 求解以各个位置为中心的回文串最长长度,用一个栈维护有序的回文串中心位置,不断弹出无法覆盖当前位置的元素,则可以得到。中以各个位置为左边界的最短回文串。DP 求解以各个位置为边界的答案即可。观察到对于任一个 “beautiful string”对于此类后推形式的 DP,倒序递推较为方便,可以以。为左边界的最短回文串,将。原创 2023-07-01 17:05:35 · 404 阅读 · 0 评论 -
Codeforces 1734F 数位 DP
由于加法存在进位的可能,需要枚举不同进位的情况。数位 DP 求解,时间复杂度。原创 2023-06-19 15:07:50 · 366 阅读 · 0 评论 -
P3643 [APIO2016] DP
令值域规模为 $M$。朴素的 DP 是 $O\Big((NM)^2\Big)$,前缀和优化后可以做到 $O(N^2M)$。由于 $M$ 规模为 $10^9$,考虑离散化;为了方便处理,将区间表示为左闭右开。原创 2022-08-12 12:09:02 · 148 阅读 · 0 评论 -
Codeforces 1679E DP
题意传送门 Codeforces 1679E Typical Party in Dorm题解枚举子串,考虑到回文串的性质,从字串中间开始枚举。令 ∣t∣=sz\lvert t\rvert = sz∣t∣=sz。设 a,ba,ba,b 分别为子串中对称位置的字符,若 a=′?′,b=′?′a='?',b='?'a=′?′,b=′?′,必须设置相同的字符,则贡献为乘以 szszsz,若 a=′?′a='?'a=′?′ 或 b=′?′b='?'b=′?′ 则其对称位置的字符必须包含在查询串 ttt 中才可原创 2022-05-18 22:02:21 · 407 阅读 · 1 评论 -
Codeforces 1525F 二分图最小点覆盖 + DP
题意传送门 Codeforces 1525F Goblins And Gnomes题解若 DAG 的最小路径覆盖数小于等于哥布林数,则必败。DAG 的最小路径覆盖是一个经典问题,可以转换为求解拆点二分图的最大匹配。只删除图中某个节点的出边或入边等价于删除二分图上的某个节点,最大化收益则需要删除的点数尽可能小,那删除二分图最大匹配的必经点可以满足要求。二分图的最小点覆盖等于最大匹配。以任意次序删除二分图的最小点覆盖可以发现,最大匹配数依次减少一。那么问题中删除的点集就是最小点覆盖的某个子集。二分图最原创 2022-04-24 11:13:09 · 1032 阅读 · 0 评论 -
SGU 475 状压 DP
题意传送门 SGU 475 Be a Smart Raftsman题解容易想到枚举每一条路上使用船的人员集合,时间复杂度 O(22nm)O(2^{2n}m)O(22nm)。考虑如何优化状态转移的过程。对于任一个状态, 其转移都可以通过改变每一个人的位置得到,对应于二进制压缩的状态即每一位的异或。那么可以将已改变位置状态的人数作为 DP 的阶段(类似于 Floyd 求最短路的想法),O(2nn)O(2^nn)O(2nn) 完成状态转移。总时间复杂度 O(mn2n)O(mn2^n)O(mn2n)。#i原创 2022-04-04 22:14:56 · 1104 阅读 · 0 评论 -
P1450 [HAOI2008] 容斥原理 + DP
题意传送门 P1450 [HAOI2008]硬币购物题解求满足 ∑xkck=s\sum x_k c_k = s∑xkck=s 的非负整数解个数。令 SkS_kSk 代表满足 xk≤dkx_k \leq d_kxk≤dk 的解集。问题即求∩Sk=∪Sk‾‾\cap S_k = \overline{\cup \overline{S_k}}∩Sk=∪Sk 则转换为存在下界约束的方程,以 Sk‾\overline{S_k}Sk 为例,下界约束 xk≥dk+1x_k\geq d_k+1原创 2022-03-31 20:24:16 · 973 阅读 · 0 评论 -
P4297 [NOI2006] 树形 DP
题意传送门 P4297 [NOI2006] 网络收费题解对于非叶子节点,若 nA<nBnA < nBnA<nB,令其状态为 AAA,反之为 BBB。那么两个用户对应流量的费用可以拆分为单个用户的贡献,即当用户 vvv 与其祖先节点 uuu 状态相同时,vvv 贡献为 v→uv\rightarrow uv→u 的流量。祖先节点的状态依赖于叶子节点的状态,而叶子节点的贡献依赖于祖先节点的状态。那么先自顶而下地枚举祖先节点的状态,在自底向上地通过树形 DP 进行合并。根据主定理,总时间原创 2022-03-31 12:32:38 · 120 阅读 · 0 评论 -
Codeforces gym103389J 树形 DP
题意传送门 Codeforces gym 103389J 最大权边独立集题解从边的角度考虑,会涉及两个节点的枚举,不易处理。仅考虑新增的 j(0≤j≤k,2×j≤n)j(0\leq j\leq k,2\times j\leq n)j(0≤j≤k,2×j≤n) 条边出现在最大权边独立集的情况,问题等价于选择图中 2×j2\times j2×j 个节点删除的最大边权独立集。dp[v][i][j]dp[v][i][j]dp[v][i][j] 代表以节点 vvv 为根的子树上,删除 iii 个节点,vvv原创 2022-03-30 20:43:28 · 365 阅读 · 0 评论 -
P4158 [SCOI2009] DP
题意传送门 P4158 [SCOI2009]粉刷匠题解各木板间粉刷互不相关。存在一个最优解,其染色方案不会出现重叠染色的格子。预处理木板 bbb 粉刷 iii 次可以正确粉刷的最多格子数 g[b][i]g[b][i]g[b][i],可以通过枚举最后连续的一段染色区间进行递推。dp[i+1][j]dp[i+1][j]dp[i+1][j] 代表粉刷 0⋯i0\cdots i0⋯i 共 i+1i+1i+1 块木板 jjj 次可以正确染色的最多格子数,可以枚举第 iii 块木板染色的次数,通过 ggg 进原创 2022-03-25 22:25:55 · 443 阅读 · 0 评论 -
P2515 [HAOI2010] SCC 分解 + 树形 DP
题意传送门 P2515 [HAOI2010]软件安装题解对于每个依赖,从 D[i]D[i]D[i] 向 iii 连一条边,每个节点至多存在一条入边,则得到的有向图实际上是一个外向树(基环树的一类)森林。分解强连通分量,缩点得到森林,添加超级源点,问题转化为有树形依赖的背包问题,树形 DP 即可。总时间复杂度 O(nm2)O(nm^2)O(nm2)。#include <bits/stdc++.h>using namespace std;#define pb push_backcon原创 2022-03-08 10:43:08 · 158 阅读 · 0 评论 -
P2272 [ZJOI2007] SCC 分解 + DP
题意传送门 P2272 [ZJOI2007]最大半连通子图题解分解强连通分量后缩点得到 DAG。位于同一个 SCC 中的任意两点显然满足它们之间至少存在一条路径。任意一个 SCC 中的点 uuu 与其可达的 SCC 中的点 vvv,显然也满足条件。问题转化为求 DAG 中点权最大的路径,拓扑序 DP 求解即可。总时间复杂度 O(n+m)O(n+m)O(n+m)。#include <bits/stdc++.h>using namespace std;#define pb push_ba原创 2022-03-04 12:58:06 · 164 阅读 · 0 评论 -
Codeforces Round #772 (Div. 2)
传送门Codeforces Round #772 (Div. 2)A按位考虑,若存在第 kkk 位为 111 的元素,则可以用这个元素将其余元素的第 kkk 位变为 000;为满足操作的约束,存在 111 的每个数位至少需要保留一个元素。故最小和为所有元素的按位或。总时间复杂度 O(n)O(n)O(n)。#include <bits/stdc++.h>using namespace std;#define pb push_backtypedef long long ll;cons原创 2022-02-23 16:56:31 · 243 阅读 · 0 评论 -
LeeCode 472 Trie + DP
题意传送门 LeeCode 472 连接词题解令单词数量为 nnn,单词长度为 mmm。dp[i]dp[i]dp[i] 代表单词 sss 从位置 iii 到结尾处,能否由至少一个较短单词构成,边界条件 dp[m]=1dp[m]=1dp[m]=1。可以通过建 TrieTrieTrie,O(m)O(m)O(m) 枚举以 s[i]s[i]s[i] 为开头的较短单词,记忆化求解。总时间复杂度 O(nm2)O(nm^2)O(nm2)。bool cmp() class Solution{ const原创 2022-01-14 19:50:11 · 232 阅读 · 0 评论 -
POJ 2888 Burnside 引理 + 矩阵快速幂 + DFS
题意传送门 POJ 2888 Magic Bracelet题解根据 Burnside 引理,令 C(i)C(i)C(i) 代表旋转 iii 个单位的置换下的不动点,则答案为原创 2022-01-11 11:13:48 · 240 阅读 · 0 评论 -
Codeforces 808G KMP + DP
题意传送门 Codeforces 808G Anthem of Berland题解设 dp[i+1][j]dp[i+1][j]dp[i+1][j] 代表以 iii 为结尾的 sss 前缀与 ttt 的最长匹配长度为 jjj 时,模式串 ttt 在 sss 前缀中出现的最多次数。KMPKMPKMP 建自动机求解即可。总时间复杂度 O(26×∣s∣×∣t∣)O(26\times\lvert s\rvert\times\lvert t\rvert)O(26×∣s∣×∣t∣)#include <bit原创 2021-12-14 18:31:47 · 413 阅读 · 0 评论 -
P3193 [HNOI2008] KMP + 矩阵快速幂
题解传送门 P3193 [HNOI2008]GT考试题解以准考证号后缀与不吉利数字的最长匹配长度为状态,KMPKMPKMP 预处理处状态转移矩阵,进行矩阵快速幂即可。总时间复杂度为 O(M3logN)O(M^3\log N)O(M3logN)。#include <bits/stdc++.h>using namespace std;#define rep(i, l, r) for (int i = l, _ = r; i < _; ++i)const int MAXN = 2原创 2021-11-27 18:42:56 · 214 阅读 · 0 评论 -
Codeforces 1574F 图论 + DP
题意传送门 Codeforces 1574F Occurrences题解任一数组 AiA_iAi 在构造数组中出现的次数不能小于 AiA_iAi 中任意非空子数组的出现次数,那么存在重复元素的数组的任意非空子数组一定不会出现在构造串中。则可能出现的数组任意元素一定是互异的,而这样的数组可能存在重复元素,这样的重复部分仅当分别位于数组 AiA_iAi 的后缀与 AjA_jAj 的前缀才能出现在构造数组中。对于任意出现在构造数组中的元素 Ai,jA_{i,j}Ai,j,其后继一定是 Ai,j+原创 2021-11-26 13:02:34 · 161 阅读 · 0 评论 -
LeeCode 2060 DP
题意传送门 LeeCode 2060 同源字符串检测题解考虑如何进行匹配。由于字符串编码的性质,匹配串间会出现长度差,若串 sss 比串 ttt 长的部分存在字母,则会难以处理。考虑从当前已处理部分较短的字符串进行处理,那么字符串长度差不会超过 10310^3103;若长度差为零,则优先处理后续部分为数字型字符的字符串,若不存在这样的字符串,那么直接匹配字符即可。此时保证串 sss 比串 ttt 长的部分都是可以任意匹配的字符。dp[i][j][k]dp[i][j][k]dp[i][j][k] 代原创 2021-11-02 20:30:27 · 129 阅读 · 0 评论 -
Codeforces 1551F 枚举 + DP
题意传送门 Codeforces 1551F题解若 K=2K=2K=2,则任一一对节点都满足条件,答案为 N(N−1)/2N(N-1)/2N(N−1)/2。若 K≥3K\geq 3K≥3,容易证明,若节点 uuu 被选择,那么其余节点只可能同时处于 uuu 某条连边的某一侧。那么,被选择的节点 uuu 不可能位于任一对被选择的节点 v,w,v≠u,w≠uv,w,v\neq u,w\neq uv,w,v=u,w=u 间的路径上。容易证明,被选择的节点集 SSS 所构成的生成树,只可能存在一个度原创 2021-09-21 10:41:52 · 120 阅读 · 0 评论 -
P6748『MdOI R3』树形 DP + 贪心
题解传送门 P6748 『MdOI R3』Fallen Lord题解构造的树的任一边的权值上界都为 MMM。设节点 uuu 的度为 dud_udu,则与 uuu 相连的边中,uuu 对 ⌊du/2⌋+1\lfloor d_u/2\rfloor+1⌊du/2⌋+1 条边有边权上界为 AuA_uAu 的约束,对其余 du−(⌊du/2⌋+1)d_u-(\lfloor d_u/2\rfloor+1)du−(⌊du/2⌋+1) 条边无边权上界的约束。考虑任意节点 uuu,若其非根节点,则仅存在一条原创 2021-09-04 14:46:41 · 105 阅读 · 0 评论 -
P6786「SWTR-6」DP
题意传送门 P6786 「SWTR-6」GCDs & LCMs题解设 gcd(bi,bj)=d,bi=ad,bj=bd,a<bgcd(b_i,b_j)=d,b_i=ad,b_j=bd,a<bgcd(bi,bj)=d,bi=ad,bj=bd,a<b,则有ad+bd+d=abdad+bd+d=abdad+bd+d=abd 即 a+b+1=aba+b+1=aba+b+1=ab 将式子变形得到(a−1)(b−1)=2(a-1)(b-1)=2(a−1)(b−1)=2 得到解原创 2021-08-23 09:33:09 · 127 阅读 · 0 评论 -
P2501 [HAOI2006] DP
题意传送门 P2501 [HAOI2006]数字序列题解改变最少的数字,使序列单调严格上升。考虑补集,即原序列中最长的子序列,其中任意位置 i,ji,ji,j 的数字满足 Ai−Aj≥i−jA_i-A_j\geq i-jAi−Aj≥i−j。设 Bi=Ai−iB_i=A_i-iBi=Ai−i,问题转化为求 BBB 中的最长不降子序列,转化为经典的类 LISLISLIS 问题,使用二分优化的 DPDPDP 求解,时间复杂度 O(NlogN)O(N\log N)O(NlogN)。在改变数字最少的原创 2021-08-12 11:36:21 · 152 阅读 · 0 评论 -
P1020 [NOIP1999 普及组] DP + Dilworth 定理
题意传送门 P1020 [NOIP1999 普及组] 导弹拦截题解设导弹飞行高度数组为 HHH,则单个系统能拦截的最多导弹,为 HHH 的最长不升子序列。根据 DilworthDilworthDilworth 定理,偏序集中最大反链的大小等于最小链划分的大小。那么拦截所有导弹所需的系统数目等于以 i<j,H[i]≥H[j]i<j,H[i]\geq H[j]i<j,H[i]≥H[j] 为关系的二维偏序集的最小链划分,即最大反链的大小。在偏序集中,第一维不同值的 iii 唯一,i>原创 2021-08-07 11:07:15 · 107 阅读 · 0 评论 -
P3953 [NOIP2017 提高组] 拓扑排序 + Dijkstra + DP
题意传送门 P3953 [NOIP2017 提高组] 逛公园题解首先处理合法路线无穷多的情况。合法路线无穷多当且仅当图中出现权值和为 000 的环,且存在一条经过环上的点且权值和不超过 D+KD+KD+K 的路径。求解这样的环,可以对边权为 000 的边建正图以及反图,分别进行拓扑排序。那么权值和为 000 的环上的点 xxx 满足下述两个条件:存在与 xxx 相连的边权为 000 的边;xxx 在正、反图拓扑排序中入度始终大于 000。原理是正、反图拓扑排序分别能够处理与环相连的入边与出边。若存原创 2021-07-28 10:07:08 · 139 阅读 · 0 评论 -
P1514 [NOIP2010 提高组] DP + 贪心
题意传送门 P1514 [NOIP2010 提高组] 引水入城题解容易通过 DFSDFSDFS 求解在城市 (0,j)(0,j)(0,j) 处建蓄水厂的情况下,在 N−1N-1N−1 行可以建输水站的城市集合 S(0,j)S_{(0,j)}S(0,j)。由于连续的水利设施需要满足高度的单调性,搜索的路径上不可能出现环,那么可以记忆化搜索。dp[i][j]dp[i][j]dp[i][j] 代表 S(i,j)S_{(i,j)}S(i,j),对集合进行二进制状态压缩,那么有递推式dp[i][j]=2j原创 2021-07-28 09:21:14 · 102 阅读 · 0 评论 -
P3842 [TJOI2007] DP
题意传送门 P3842 [TJOI2007]线段题解每一行必须走完当前线段,再走到下一行,那么走完当前行时所在位置只有两种可能,即线段左端点与右端点。dp[i][0],dp[i][1]dp[i][0],dp[i][1]dp[i][0],dp[i][1] 分别代表在行 iii 左右端点且走完当前行的线段时,在行方向的最短路程。dp[i][j]=mink∈[0,1]dp[i−1][k]+∣B[i−1][k]−B[i][j⊕1]∣+B[i][1]−B[i][0]dp[i][j]=\min\limits_原创 2021-07-17 17:37:24 · 118 阅读 · 0 评论 -
AcWing 232 概率 + DP
题意传送门 AcWing 232 守卫者的挑战题解dp[i+1][j][k]dp[i+1][j][k]dp[i+1][j][k] 代表在 0⋯i0\cdots i0⋯i 这 i+1i+1i+1 个挑战中,成功了 jjj 次,背包剩余容量为 kkk 的概率。显然,状态向前递推比较方便。根据挑战是否成功,得到{dp[i+1][j+1][k+a[i]]+=dp[i][j][k]×p[i]dp[i+1][j][k]+=dp[i][j][k]×(1−p[i])\begin{cases}dp[i+1][j+1原创 2021-05-29 22:18:34 · 106 阅读 · 0 评论