动态规划
文章平均质量分 59
Strezia
这里介绍不了我
展开
-
#820 Div.3 G. Cut Substrings dp*
cf#820 Div3. G. Cut Substrings原创 2022-09-13 22:18:20 · 396 阅读 · 0 评论 -
#816 Div2E. Long Way Home 斜率优化dp
E. Long Way Home原创 2022-08-26 15:54:23 · 286 阅读 · 0 评论 -
1391D. 505 状压dp
状压dp原创 2022-07-30 03:39:28 · 137 阅读 · 0 评论 -
杭电多校3 1012. Two Permutations dp*
杭电多校3 1012原创 2022-07-30 00:52:20 · 236 阅读 · 0 评论 -
L. Link with Level Editor I dp
牛客多校第二场L题原创 2022-07-24 17:45:51 · 731 阅读 · 0 评论 -
CF1674G. Remove Directed Edges dp
Problem Gdag上的dp题意给你一个有向无环图,你需要删去其中的若干条边,使得对于每个节点,它的入度比原来小,或原来即为0对于每个节点,它的出度比原来小,或原来即为0在删边之后的图中取出一个点集 SSS, 满足 SSS 中任意两点 u,vu,vu,v 或满足 uuu 可达 vvv 或满足 vvv 可达 uuu,问 SSS 中元素最多有多少个?思路首先满足条件的点集 SSS ,一定是一条链。所以我们最终的 SSS 只需要保留一条链,其它的边都没有必要。问题类似于在一个dag上找最原创 2022-05-03 12:45:45 · 532 阅读 · 0 评论 -
F. 孤独的树 思维
link思维, 正解是一个感觉挺复杂的树形dp,有空补一下。牛客的小白赛,官方视频题解题意思路乱搞的,,其实并不知道为什么对,但确实过了这道题。先预处理出 c[i] 数组,表示 i 的质因子个数。然后任选一个点开始 dfs, 找每个点和它子节点的gcd, 贪心地修改父节点。代码int c[100010], a[100010];int n;vector<int> e[100010];int ans = 0;int gcd(int a, int b) { if(!b)原创 2022-04-24 00:36:02 · 363 阅读 · 0 评论 -
CF1668D. Optimal Partition* dp 2100
link#782 div.22100, 树状数组优化dp,离散化题意给你一个数组,要求你分成若干个连续的子数组,每个子数组的价值为:若子数组数字和为正数,价值为数组长度和为0,价值为0和为负数,价值为数组长度 * -1求子数组价值和最大值。 n≤5e5,−1e9≤ai≤1e9n \leq 5e5, -1e9\leq a_i\leq 1e9n≤5e5,−1e9≤ai≤1e9思路设 vali,jval_{i, j}vali,j 表示数组第 iii 到第 jjj 项的价值, dpidp原创 2022-04-24 00:14:18 · 171 阅读 · 0 评论 -
Acwing287.积蓄程度 树形dp换根
link二次扫描与换根,对于没有确定根的题目往往可以用到题意思路1.考虑朴素解法,枚举根 sss ,设 d[x] 为从 x 出发流向子树的最大流量,很容易求出dp方程(即代码中dfs部分)。对于每个根都进行一次dp,时间复杂度 O(n2)O(n^2)O(n2)。2.考虑优化,首先任选一个源点 sss 进行同上的dp,设 f[x] 表示把 x 作为根,流向整个水系的最大流量。则对于根节点 xxx , f[x] = d[x]。考虑 xxx 的子节点 yyy ,f[y] 包涵两部分:从 yyy 流原创 2022-04-05 13:25:40 · 379 阅读 · 0 评论 -
Acwing298.围栏 单调队列优化dp *
Link思路首先把所有工匠按 SiS_iSi 从小到大排序,保证能按顺序进行线性dp设 f[i][j] 表示安排前 iii 个人粉刷前 jjj 块木板(可以有空着不刷的木板),工匠们能获得的最多报酬。第 i 个工匠什么也不刷,f[i][j] = f[i-1][j]第 j 块木板可以空着不刷,f[i][j] = f[i][j-1]第 i 个工匠粉刷第 k+1 块到第 j 块木板,由于该工匠粉刷总数不能超过 LiL_iLi, 且必须粉刷 SiS_iSi, 所以需要满足: k+1≤Si≤j,原创 2022-03-24 15:58:15 · 156 阅读 · 0 评论 -
acwing280.陪审团 01背包
link01背包思路f[i][j][k]表示在前i个人中选出j个人,此时辩方总分与控方总分差为k时,二者和的最大值维护 fff 数组由于是绝对值,所以要用一个偏移量delta,由于评分都在0-20之间,且最多选20人,也就是说abs(k)最多为400,于是这里取delta = 400,所以 k 的范围就是 0≤k≤8000 \leq k \leq 8000≤k≤800。找出最小差值k显然就是最接近400的数。找出对应的方案入选的人方法是反过来推。首先从f[i][j][v](i=n,j=原创 2022-03-23 16:57:27 · 409 阅读 · 0 评论 -
Gym102916D. Two Pirates - 2 期望dp
Link题意有 nnn 个价值为 aia_iai 的宝藏,清醒的海盗和喝醉的海盗轮流拿。清醒的海盗总是会拿价值最大的宝藏,喝醉的海盗则会随机挑一个剩下的,问两个海盗获得宝藏总价值的期望。思路首先把宝藏价值从小到大排序,由题意每次清醒的海盗都会拿价值最大的,也就是最右侧的,喝醉的海盗随机拿。反过来思考,在空箱子中从小到大轮流放球,清醒海盗放的球为黑色,醉海盗为白色,第 iii 个球为黑色表示清醒海盗拿了第 iii 个宝藏。概率dp,dp[i][j]表示已经放了 iii 个球,其中第 jjj 个为原创 2022-03-21 23:38:46 · 532 阅读 · 0 评论 -
CF1446C Xor Tree 字典树*
link01字典树,dp, 2100想了很久才想明白。。总之问题等价于保留尽可能多的数,使只存在一对(i,j)(i, j)(i,j) 对彼此而言异或值都是最小的。建立字典树,设 fpf_pfp 表示以 ppp 为根的子树最多保留多少个数。对于以 ppp 为根的子树,1.若它没有子节点(即为叶节点),则f[p]=1;2.若仅有一个子节点,则f[p]=f[p的子节点];3.若它有两个子节点,则f[p]=max(f[p的子节点]) + 1;对于3,如果我们考虑取左子树,则无论任取右子树中的哪一个,原创 2022-03-01 16:31:21 · 107 阅读 · 0 评论 -
CF1631F. Flipping Range dp **
linkdp, 2400,非常妙的一道题目类似这种每次操作都是对连续 kkk 位进行的不妨用对位置取模的dp题意给定数组 aaa 和集合 BBB,你可以进行如下操作任意多次(可以为0次): ∀x∈B,翻转数组a中连续的x位,同一个x也可以多次取出\forall x\in B,翻转数组a中连续的x位,同一个x也可以多次取出 ∀x∈B,翻转数组a中连续的x位,同一个x也可以多次取出问:max Σaimax\space \Sigma a_imax Σai思路首先假设 x,y∈B原创 2022-02-22 00:52:40 · 415 阅读 · 0 评论 -
CF1631E. Paint the Middle **
linkdp/贪心 2200题意给定 nnn 个元素,元素 iii 具有值 aia_iai 和颜色 cic_ici,最初,对于所有 iii,ci=0c_i=0ci=0。可以不限次数地进行以下操作:选取三个元素i,j,k(1≤i<j<k≤n)i,j,k(1\leq i<j<k\leq n)i,j,k(1≤i<j<k≤n),其中ci=cj=ck=0c_i=c_j=c_k=0ci=cj=ck=0且ai=aka_i=a_kai=ak,令cjc_jcj=1原创 2022-02-21 19:33:28 · 195 阅读 · 0 评论 -
CF1627E. Not Escaping *
Linkdp,离散化, 2200题意有一栋 nnn 层高楼,每层有 mmm 个房间,现在需要从(1,1)→(n,m)(1,1) \rightarrow (n, m)(1,1)→(n,m),同层间向左or右移动需要消耗 xix_ixi 点体力(每层对应一个 xix_ixi ),除此之外有 kkk 个梯子,可以从(i,j)→(p,q)(i, j)\rightarrow (p, q)(i,j)→(p,q) 并恢复 kik_iki 点体力,保证i<pi < pi<p,问到达终点所需的最原创 2022-02-20 12:55:23 · 244 阅读 · 0 评论 -
CF1592E2.Rubik‘s Cube Coloring 2400 —— dp + tree ?
1592E2原创 2021-10-28 20:48:38 · 130 阅读 · 0 评论 -
CF1598E. Staircases 2100 —— dp
1598E通过数组dp[0/1][i][j]表示以(i, j)结尾的楼梯数量,1表示横着的,0表示竖着的初始值把所有dp[0/1][i][j]赋值为1,但这样会导致所有长度为1的楼梯被统计了两次,故用tot记录长度为1的楼梯注意考虑line 68 70的情况(边界条件不要忘记重新赋值1)注意line 77 82 88 89,向后更新时如果后续某个点已经被锁定(不能作为阶梯),则置0// Decline is inevitable,// Romance will last for.原创 2021-10-27 12:34:29 · 180 阅读 · 0 评论 -
CF1582F1. Korney Korneevich and XOR ——dp*
1582F1题意:给出一个长度为n的数组,问你有多少个数可以通过其中的某个不下降子序列xor得到1 <=n<=1e5, 0 <= ai <= 500.思路:用数组b[i][j]= k表示前i个数能凑出来异或和为j时,最后一项最小为k从1到n遍历a数组,可以把第一维i优化掉b[j] = k表示当前凑出j的最后一项最小为k每次遍历时先比较b[a[i]] = min(b[a[i]], a[i]);然后遍历0-511,更新值注意最大值是511而不是500.原创 2021-10-25 21:25:35 · 156 阅读 · 0 评论 -
POJ1417 True Liars ——种类并查集+01背包+路径** 好题
POJ1417题意:有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q);天使只说真话,恶魔只说假话;如果不能确定所有天使的编号,输出no,若能确定,输出所有天使的编号,并且以end结尾;注意:可能会有连续两行一样的输入;思路:注意到若回答yes,则x y必同种类,否则x y必异种类,所以通过种类并查集分类。维护完并查集之后并不能确定哪些是好人哪些是坏人,只能确定相对原创 2021-10-01 16:12:18 · 291 阅读 · 0 评论 -
CF1572A. Book 1800 ——拓扑排序+dag上最长路*
A. Book题意:给出n本书,对于每本书给出ki个数,你能理解第i本书当且仅当你全部读过这ki本书,问读多少轮可以理解全部的书,1轮指1-n都读一遍。若无法理解 则输出-1。思路:不难想到拓扑排序,先把入度为0的所有点加入队列,扫描从队列中的点u出发的边指向的点v,dp[v] = max(dp[v], dp[u] + (u > v)),注意每次遍历都减少v点的入度,若入度为0则加入。// Decline is inevitable, romance will last fo原创 2021-09-26 10:56:46 · 207 阅读 · 0 评论 -
DAG上的动态规划——硬币问题
紫书262 硬币问题题意:给定n种硬币面额, 求最少和最多的硬币数量使得它们的和是s思路:即固定起点和终点的动态规划,建立数组表示还要凑足的面值,则初始状态为s,终状态为0,可以用记忆化搜索 也可递推// Decline is inevitable// Romance will last forever#include <bits/stdc++.h>using namespace std;#define mst(a, x) memset(a, x, sizeof(a))原创 2021-09-10 20:28:25 · 147 阅读 · 0 评论 -
Uva10917 林中漫步 最短路+DAG上dp
蓝书330 DAG上的dp, 注意输出路径条数时的dfs函数 if(i == 终点) return 1 如果dis[u] > dis[v],则dfs(v), 并且d[u] += d[v]// Decline is inevitable// Romance will last forever// UVA 10917#include <bits/stdc++.h>#define mst(a, x) memset(a, x, sizeof(a))#define INF 0x3原创 2021-09-10 00:02:11 · 108 阅读 · 0 评论 -
DAG上的动态规划——最长路CF4D Mysterious Present
CF4D Mysterious Present 用bool存储是否有边题目链接最长路例题像这种DAG上的最短路 往往只需要记录是否存在边 故可以用bool节省空间,该题用bool就可以过 而用int就会MLE// Decline is inevitable// Romance will last forever#include <bits/stdc++.h>#define mst(a, x) memset(a, x, sizeof(a))#define in..原创 2021-09-09 20:52:36 · 105 阅读 · 0 评论 -
DAG上的动态规划——最长路模型
DAG上的动态规划 嵌套矩形 紫书262题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。分析:矩形间的“可嵌套”关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形X可以嵌套在Y中,则就从X到Y连一条原创 2021-09-08 22:29:22 · 217 阅读 · 0 评论