ACM - DP
文章平均质量分 64
动态规划专栏
行码棋
退役ACMer,落魄过,那么光亮在何时?
展开
-
【树形DP】树上拓扑序计数
每个公司是一棵树,然后每个公司可以看做连在一个虚拟的根上。每个公司的计算方案实际上就是计算这棵树的拓扑序的个数。进行合并:即先把各子树的方案数乘起来算出总方案,然后考虑各子树元素的相对排列顺序,即在总的节点个数中选。个位置,剩下的排在后面,保证每颗子树的相对拓扑序不变。为根的子树的大小(节点的数量)节点有四颗子树,子树大小分别为。当树为二叉树时,将两个子树。为根的子树的拓扑序数。原创 2022-08-20 10:32:02 · 1257 阅读 · 0 评论 -
【子矩阵数量统计】CF1181C Flag子矩阵数量统计
子矩阵数量统计原创 2022-06-29 16:44:09 · 535 阅读 · 0 评论 -
【容斥定理】【背包问题】P1450 [HAOI2008]硬币购物
题目链接:https://www.luogu.com.cn/problem/P1450乍一看是多重背包的题目,没错就是多重背包,但是复杂度呢? O(105∗105∗1000)O(10^5 * 10 ^5 * 1000)O(105∗105∗1000)太大,必然超时本题主要使用容斥不明白容斥的话可以先去学一下容斥的思想及原理用没有条件限制(物品数量限制)的答案数减去不满足限制(选择的物品数量超过了题目中的限制)的答案数就是要求(题目限制物品数量)的答案数f[j]f[j]f[j]代表没有题目中原创 2022-04-17 22:02:32 · 470 阅读 · 0 评论 -
【状压DP】砝码称重
[1,n][1,n][1,n]共n个砝码,可以将这n个砝码取不取变成一个状态i,我们枚举这个状态i,只有当状态i中的二进制1的个数为n - m时,才进行相应的求最大值操作。求最大值:建一个bitset,,第i位代表数字i能否被取到,因为砝码只能放在一边,所以砝码之间的重量全部是加法操作,默认第0位为1代表重量0能够被取到公式 b=b∣b<<a[j]b = b | b << a[j]b=b∣b<原创 2022-04-13 18:32:03 · 623 阅读 · 0 评论 -
【区间DP】B. Zuma
https://codeforces.com/problemset/problem/607/Bf[i][j]f[i][j]f[i][j]:代表区间[i,j][i,j][i,j]合并的最小花费初始化:f[i][i]=1f[i][i] = 1f[i][i]=1f[i][i+1]=1,a[i]==a[i+1]f[i][i + 1] = 1, a[i]==a[i + 1]f[i][i+1]=1,a[i]==a[i+1]f[i][i+1]=2,a[i]≠a[i+1]f[i][i +1] = 2, a[原创 2022-04-12 21:20:09 · 421 阅读 · 0 评论 -
【树形DP】月之暗面
题目链接https://ac.nowcoder.com/acm/contest/11187/Dx中普通颜色,y中特殊颜色,要求任意两个节点如果染得都是特殊颜色要求不一样,求所有的染色方案本题需要找好状态表示。父节点的颜色会影响子节点的选择的颜色种类,(但是如果确定了子节点染了什么染色,无法确定父节点所染的颜色种类,所以注定是从根往子节点推)我们可以发现父节点染普通颜色,子节点可以染x种普通颜色和y种特殊颜色父节点染特殊颜色,子节点可以染x中普通颜色和y - 1 种特殊颜色便有:状原创 2022-03-17 16:24:19 · 413 阅读 · 0 评论 -
【DP】【子串】C. Unstable String
链接:https://codeforces.com/problemset/problem/1535/Ct 组询问,每次给定一个仅包含字符 1 或 0 或 ? 字符串 s。定义一个子串是不稳定的当且仅当子串中任意相邻两数均不相同,如 101010…101010… 或 010101…010101…。其中 ? 可以变为 1 或 0 其中一种。请求出给定的 s 中最多可以有的不稳定子串个数。状态表示:f[i]f[i]f[i]:代表以s[i]s[i]s[i]结尾的满足题意子串的数目状态转移:f[i]原创 2022-02-27 17:19:25 · 148 阅读 · 0 评论 -
【整除分块】【前缀和】【DP】D. Up the Strip(简单版 + 正常版)
整除分块给出一道例题,已知n, 求∑i=1n⌊ni⌋\sum_{i=1}^{n} \lfloor\frac{n}{i} \rfloor∑i=1n⌊in⌋这就是整除分块的基本例题画一个表格找一下怎么计算,以n = 15为例i123456789101112131415⌊15i⌋\lfloor \frac{15}{i}\rfloor⌊i15⌋1575332211111111证明:假设分块的左端点为l,要求分块的右端原创 2022-02-24 17:47:31 · 244 阅读 · 0 评论 -
【最大子段和DP】【前缀和】C. Increase Subarray Sums
题目链接:https://codeforces.com/contest/1644/problem/Cf(k)f(k)f(k)表示对一个数组中不同的k个元素做加x操作,最后的最大字段和。求f(0),f(1),...,f(n)f(0),f(1),...,f(n)f(0),f(1),...,f(n)对数组a做前缀和状态表示:f[i−j+1]f[i-j+1]f[i−j+1]:子段长度为i - j + 1的最大子段和状态转移:f[i−j+1]=max(f[i−j+1],s[i]−s[j−1])f原创 2022-02-23 16:44:24 · 737 阅读 · 0 评论 -
【DP】【二进制】Codeforces Round #772 (Div. 2) D.Infinite Set
链接:https://codeforces.com/contest/1635A. Min Or Sum只要满足两个值的或结果在某一位上为1的时候,保证两个值有一个为1即可。所以结果为所有值的或,只要所有值该位上有1,那么结果就存在1#include<bits/stdc++.h>using namespace std;void solve(){ int n; cin >> n; int res = 0; for(int i = 1; i <= n; i+原创 2022-02-21 18:40:22 · 317 阅读 · 0 评论 -
【暴搜】【简单DP】挖地雷
简单DP,暴搜原创 2022-02-14 14:25:12 · 227 阅读 · 0 评论 -
【数位DP】数位小孩
数位DP原创 2022-02-10 19:18:02 · 252 阅读 · 4 评论 -
【01背包问题】【题目收集】
01背包原创 2022-02-10 09:00:00 · 852 阅读 · 0 评论 -
【记忆化搜索】【DP】每日一题-滑雪(洛谷P1434)
记忆化搜索原创 2021-03-19 17:30:34 · 151 阅读 · 0 评论 -
【多重背包】硬币
多重背包原创 2022-01-30 21:43:21 · 378 阅读 · 0 评论 -
【状压DP】Corn Fields牧场的安排
状压DP模板例题原创 2022-01-18 17:49:12 · 482 阅读 · 0 评论 -
【DP】牡牛和牝牛
动态规划习题题解思路原创 2022-01-04 15:06:41 · 350 阅读 · 0 评论 -
【树形DP】联合权值
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:一个n个点n-1条边的连通图,图中距离为2的点对(u,v)(u,v)(u,v)会产生wu∗wvw_u * w_vwu∗wv的联合权值,求图中所有的点对的联合权值的最大值和所有联合权值的和(和要对10007取模)首先注意只让对和取模了,对最大值没有让取模,所以要注意最大值不能取模原创 2021-11-08 21:36:26 · 802 阅读 · 0 评论 -
【树形DP】最大子树和
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:一颗树,让你找到一个连通的部分使这个连通的部分的值的和最大题意:其实这也不太是树形DP,牵扯到了树形DP的思想就是让你求一棵树的最大子树和状态表示:f[u]f[u]f[u]表示以节点u为根节点的向下的子树(下面的树可能有截断)的最大和状态转移:只要下面的子树的权值小于0,我原创 2021-11-08 11:35:24 · 918 阅读 · 0 评论 -
【树形DP】没有上司的舞会
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:某大学有 n 个职员,编号为 1…n。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 rir_iri,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加原创 2021-11-08 10:42:31 · 376 阅读 · 0 评论 -
【区间DP】删数
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:有N个不同的正整数数x1,x2,...xNx_1, x_2, ... x_Nx1,x2,...xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)i(1≤i≤n)i(1≤i≤n)个数(只能从两边删除数),剩下N−iN-iN−i个数,再把剩下的数按以上操作处理,直到所有的数都被原创 2021-11-07 20:02:43 · 172 阅读 · 0 评论 -
【区间DP】矩阵取数游戏
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:对于一个给定的n×m 的矩阵,矩阵中的每个元素 均为非负整数游戏规则如下:每次取数时须从每行各取走一个元素,共 n 个。经过 m 次后取完矩阵内所有元素;每次取走的各个元素只能是该元素所在行的行首或行尾;每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值原创 2021-11-07 16:38:35 · 2846 阅读 · 0 评论 -
【DP】【高精度】乘积最大
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:长度为N的数字串,用K个乘号分成(K+1)部分,使这(K+1)部分的乘积最大,求最大乘积思路:考虑到N和K的范围较小,且让求(K+1)部分的最大乘积,我们使用动态规划求解f[i][k]f[i][k]f[i][k]表示前i位数字串分成k部分的最大乘积然后思考当前状态怎么由上一状态转原创 2021-11-05 10:50:32 · 203 阅读 · 0 评论 -
【DP基础】传球游戏
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:n个人围成一圈,从自己手上传球m次,求传到自己手上的方案数思路:f[i][j]f[i][j]f[i][j]代表传球i次,传到j位置的方案数传到j位置的方案数可以由两边的方案数转移过来,就等于左边位置的方案数加上右边位置的方案数,即f[i][j]=f[i−1][x]+f[i−1][y原创 2021-11-02 20:23:09 · 234 阅读 · 1 评论 -
Codeforces Beta Round #50 C 数位DP+概率DP
C. First Digit Law题意:有n个区间,每个区间代表一个数,这个数取值的范围就是这个区间代表的范围。然后问这n个数中代表的数首数字为1的占的比率大于等于K%K \%K%的概率思路:题目有点绕。我们可以先求n个数中首数字为1的概率,然后与K%比较,如果大于等于K%的话就让结果把这个概率加上。概率DP首先我们要求出来每个区间首数字为1的概率,就是首数字为1的数字个数除于区间中的数的总个数,对应p[i]=(double)cnt/(r−l+1)p[i] = (double)c原创 2021-09-07 23:18:10 · 168 阅读 · 0 评论 -
【字符串动态规划dp】Changing a String
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????原题链接题意:给定两个字符串,可以进行删除,替换,添加的操作,求把字符串A变为字符串B的最小操作次数,并且写出操作的具体情况思路:动态规划:状态表示:f[i][j]f[i][j]f[i][j]表示字符串a前i个字符变为字符串b前j个字符,所需要的最小操作次数状态转移:a[i]=b[j]a[原创 2021-09-02 21:49:35 · 196 阅读 · 6 评论 -
H. Phone Number (DP)-codeforces
题目链接题意:给定一个数字序列串,我们要创造相同位数的数字串,创建规则是,第一位我们可以任意选择一个数,第二位就是前一位选择的数加上该位给定数字串对应的数字再除以2,如果无法整除,可以可以向上取整也可以向下取整。例如12345第一位选择9,第二位为(9+2)/2=5.5(9+2)/2=5.5(9+2)/2=5.5,但不能取小数,可以下取整也可上取整,故可以为5或6,最后95444是一种答案问有多少种这样的答案,不包括自己思路:状态表示:f[i][j]f[i][j]f[i][j]表示选择前i个原创 2021-08-21 23:23:16 · 150 阅读 · 3 评论 -
【状压DP】吃奶酪
吃奶酪 这个题因为有一个小错误没有发现,啊啊啊,查了一下午,真的难受,记住你了思路:【状压DP】把每个奶酪看成一个01数的状态,0代表不选,1表示选,循环状态s,它的二进制表示中每个数代表第几位选还是不选状态表示:f[i][s]f[i][s]f[i][s]表示从i点出发,状态为s的最短距离,i点必须在状态s里面转移方程:f[i][s]=min(f[i][s],f[j][s−(1<<(i−1))]+dis(i,j))f[i][s] = min(f[i][s],f[j][s-(1&l原创 2021-08-14 18:09:59 · 132 阅读 · 0 评论 -
期望DP UVA11021 Tribles
原题链接思路:每种生物都是独立的,问所有生物在m天死亡的概率就是所有每种生物死亡的概率相乘即可。状态表示f[i]f[i]f[i]表示一个生物在i天内死亡完的概率状态转移f[i]=∑j=0n−1p[j]∗f[i−1]jf[i] = \sum_{j=0}^{n-1}p[j]*f[i-1]^jf[i]=∑j=0n−1p[j]∗f[i−1]j解释:p[j]∗f[i−1]jp[j]*f[i-1]^jp[j]∗f[i−1]j表示生了j个生物,然后他们在i-1天后死完的概率p[j]p[j]p[j]为原创 2021-08-10 15:13:35 · 163 阅读 · 0 评论 -
任务安排3 斜率优化DP
任务安排2任务安排31≤N≤3×105,1≤N≤3×105,1≤N≤3×105,0≤S,Ci≤512,0≤S,Ci≤512,0≤S,Ci≤512,−512≤Ti≤512−512≤Ti≤512−512≤Ti≤512此题和上面的2相比,仅仅变了TTT可以是负数是负数的话,对凸包上的点查询就不能对队首进行操作了,需要二分查找这个点,查找凸包上第一条大于等于该直线的斜率的直线,因为直线的斜率不是单增的了。其余的都一样代码:因为在acwing上做的,数据加强了,需要使用double类型#inclu原创 2021-08-08 21:36:24 · 213 阅读 · 2 评论 -
任务安排2 斜率优化DP
朴素n2n^2n2做法斜率优化DP:上面的朴素做法的式子是:f[i]=min(f[i],f[j]+t[i]∗(c[i]−c[j])+s∗(c[n]−c[j]))f[i] = min(f[i],f[j]+t[i]*(c[i]-c[j])+s*(c[n]-c[j]))f[i]=min(f[i],f[j]+t[i]∗(c[i]−c[j])+s∗(c[n]−c[j]))接下来我们要进行些改进对于下面的式子f[i]=f[j]+t[i]∗(c[i]−c[j])+s∗(c[n]−c[j])f[i] = f[j原创 2021-08-08 21:29:30 · 217 阅读 · 0 评论 -
任务安排1 斜率优化DP
题目:有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。另外,在每批任务开始前,机器需要 S 的启动时间,故执行一批任务所需的时间是启动时间 S 加上每个任务所需时间之和。一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 Ci。请为机器规划一个分组原创 2021-08-08 20:52:55 · 119 阅读 · 0 评论 -
理想的正方形 单调队列优化DP
题目:有一个 a×b 的整数组成的矩阵,现请你从中找出一个 n×n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。思路:对每一行使用单调队列求区间内的最小值和最大值并存储起来,然后对列方向分别求最小值和最大值。最终把每个n×nn×nn×n的方格的最小值和最大值存储在右下角的位置。然后遍历取答案的最小即可。代码:#include<bits/stdc++.h>using namespace std;const int N = 1010;int w[N][N];int原创 2021-08-07 15:30:23 · 424 阅读 · 0 评论 -
修建草坪 单调队列优化DP
题目:在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。FJ 有 N 只排成一排的奶牛,编号为 1 到 N。每只奶牛的效率是不同的,奶牛 i 的效率为 Ei 。靠近的奶牛们很熟悉,如果 FJ 安排超过 K 只连续的奶牛,那么这些奶牛就会罢工去开派对。因此,现在 FJ 需要你的帮助,计算 FJ 可以得到的最大效率,并且该方案中没有连续的超过 K 只奶牛原创 2021-08-07 12:00:08 · 277 阅读 · 0 评论 -
绿色通道 单调队列优化DP
题目:高二数学《绿色通道》总共有 n 道题目要抄,编号 1…n,抄第 i 题要花 ai 分钟。小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题。每道题要么不写,要么抄完,不能写一半。下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。现在,小 Y 想知道他在这 t 分钟内写哪些题,才能够尽量减轻马老师的怒火。由于小 Y 很聪明,你只要告诉他最长的空题段至少有多长就可以了,不需输出方案。思路:题目是让求最大值的最小值,原创 2021-08-06 22:55:03 · 369 阅读 · 1 评论 -
烽火传递 NOIP2010初赛 单调队列优化
题目:烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。现在输入 n,m 和每个烽火台的代价,请计算总共最少的代价在两城市之间来准确传递情报。思路:状态表示:f[i]f[i]f[i]表示从1到i里选,第i座烽台发出信号,所有情况的最小值转移方程:f[i]=min(f[j])+w[i],i−m≤j≤if[i] =原创 2021-08-06 17:40:33 · 326 阅读 · 0 评论 -
最大子序列和 (单调队列优化DP)
题目:输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。注意: 子序列的长度至少是 1。思路:要求一段连续序列的和使用前缀和的思想,区间[i,j][i,j][i,j]的连续序列和为sum(i)−sum(j−1)sum(i)-sum(j-1)sum(i)−sum(j−1),注意是j−1j-1j−1,后面有用所以只需要找到sum(i)−sum(j−1)sum(i)-sum(j-1)sum(i)−sum(j−1)的最大值,且区间长度小于等于mmm就可以原创 2021-08-06 13:51:47 · 443 阅读 · 0 评论 -
不要62 数位DP
题目:杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer)。杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。不吉利的数字为所有含有 4 或 62 的号码。例如:62315,73418,8891462315,73418,88914 都属于不吉利号码。但是,61152 虽然含有 6 和 2,但不是 62 连号,所以不属于不吉利数字之列。你的任务是,对于每次给出的一个牌照区间号,推断出交管原创 2021-08-06 00:20:02 · 188 阅读 · 0 评论 -
数字游戏 数位DP
题目:由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 mod Nmod\ Nmod N 为 000。现在大家又要玩游戏了,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个取模数。思路:状态表示:f[i][j][k]f[i][j][k]f[i][j][k]代表共i位,最高位为j,且每个位的数之和模N余数为k的数的个数状态转移:f[i][j][k]=∑x=09f[i−1][x][mod(k−j,p)]f[i][j原创 2021-08-05 22:55:16 · 303 阅读 · 0 评论 -
Windy数 数位DP
题目:Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?思路:f[i][j]f[i][j]f[i][j] 代表有i位数,最高位为j的Windy数的个数。f[i][j]=∑f[i−1][k],0≤k≤9f[i][j] = \sum{f[i-1][k]},0≤k≤9f[i][j]=∑f[i−1][k],0≤k≤9,因为位数少了1,所以最高位k无论是什么原创 2021-08-05 17:25:53 · 282 阅读 · 0 评论