动态规划
文章平均质量分 75
&*^*&
这个作者很懒,什么都没留下…
展开
-
acm-Educational Codeforces Round 104 (Rated for Div. 2) F. Ones
传送门这题真是绝了,看半天题解没理解意思,但是一旦懂了就觉得题目也不算太难,主要是方法是真的不太好描述,这里打算用图片来解释原理。我们从高位向低位考虑,也就是说给最高位编号为111,次高位编号为222,以此类推…最低位编号为nnn,然后我们设dp[i][j][k]dp[i][j][k]dp[i][j][k]代表考虑了前iii位,我们确定了一些形如111...11111...11111...11的数,满足它们的长度都大于n−in-in−i,并且对于每个数而言我们先去掉它的长度为n−in-in−i的后缀,.原创 2021-02-19 23:03:14 · 252 阅读 · 0 评论 -
acm-(交互、bfs、dp)2018 ECNU Campus Invitational Contest E. Balance Reset
cf传送门vj传送门首先注意到ai<=100a_i<=100ai<=100,也就是每次最多花费100100100,然后由于每次可以充100100100,那么其实当前的余额可以维持在[0,100)[0,100)[0,100)的范围以内(第一次除外)。考虑余额到达某个状态uuu所需要的最少物品数,记作dp[u]dp[u]dp[u],可以从状态000出发通过bfsbfsbfs更新出所有的可达状态以及其dpdpdp值。然后由于每个物品出现的概率都是12\frac 1221,我们每天都检查.原创 2021-01-23 22:40:04 · 237 阅读 · 0 评论 -
acm-(树形dp)Educational Codeforces Round 52 (Rated for Div. 2) F. Up and Down the Tree
传送门设dp[u]dp[u]dp[u]表示以uuu为根节点的子树的答案,f[u]f[u]f[u]表示从以uuu为根节点的子树的根节点uuu出发按照题述规则遍历后能够回到uuu的父节点对应的遍历的叶子节点的最大数量。设md[u]md[u]md[u]表示uuu的子树中深度最小的节点,那么更新方程就是dp[u]=∑sonf[son]+maxson{dp[son]−f[son]}dp[u]=\sum_{son}f[son]+max_{son}\{dp[son]-f[son]\}dp[u]=∑sonf[son.原创 2021-01-20 23:43:31 · 104 阅读 · 0 评论 -
acm-(dp、优化)第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)E.The Journey of Geor Autumn
传送门设dp[n]dp[n]dp[n]表示在kkk的情况下的答案,那么考虑nnn个数中最小的那个数的放置情况,显然只能放在前kkk个数中,于是枚举这个数的位置,那么更新方程就是dp[n]=∑i=1kdp[n−i]⋅Cn−1i−1⋅(i−1)!dp[n]=\sum_{i=1}^{k}dp[n-i]\cdot C_{n-1}^{i-1}\cdot (i-1)!dp[n]=∑i=1kdp[n−i]⋅Cn−1i−1⋅(i−1)!,这个方程的更新总复杂度是O(nk)O(nk)O(nk),考虑变形一下,得到dp.原创 2020-12-24 08:47:40 · 443 阅读 · 0 评论 -
acm-(dp、思维、找规律)Codeforces Global Round 10 D. Omkar and Bed Wars
传送门先令′L′'L'′L′为000,′R′'R'′R′为111,然后本题就可以无脑dp,设dp[i][j][k][h][w]dp[i][j][k][h][w]dp[i][j][k][h][w]表示考虑到字符串第iii位,s[1]=j,s[2]=ks[1]=j,s[2]=ks[1]=j,s[2]=k,s[i−1]=h,s[i]=ws[i-1]=h,s[i]=ws[i−1]=h,s[i]=w的时候对应的最小改变字符数(使得前iii个字符合法,头尾不保证合法,在最后的时候对nnn特判)。方程有亿点点不好写.原创 2020-12-19 00:11:45 · 217 阅读 · 1 评论 -
acm-(dp、区间交)Codeforces Round #661 (Div. 3) F. Yet Another Segments Subset
传送门本题考虑将线段按照长度从小到大排序,然后按照长度进行dp。dp分为两部分:第一部分:设val[i]val[i]val[i]表示与第iii条线段可以包含的所有线段(包括第iii条线段)的最大个数,并且这些线段要满足题目所述条件中的不相交(即要么包含要么不相交)关系。第二部分:设dp[x]dp[x]dp[x]表示位于iii点及其之前的所有线段能够选择的最大条数(满足题目条件的情况下)首先需要对所有线段进行离散化,然后方便起见可以添加一个长度能够覆盖所有线段的线段,编号为n+1n+1n+1,那么.原创 2020-12-16 21:51:09 · 100 阅读 · 0 评论 -
acm-(dp、分类讨论、贪心)Codeforces Round #689 (Div. 2) F. Mathematical Expression
传送门本题最复杂的情况是一个+++一个∗*∗的时候,其它情况稍微讨论一下即可。现在讨论+、∗+、*+、∗的情况,首先对于任何一个000而言,它的两边的运算符一定是+++,于是考虑两个000之间的数字的运算符该如何决定,并且这两个000之间不存在其它的0.那么这段数字只可能是1∼91\sim 91∼9,首先将这段数字左右两边的连续的111运算符都设置为+++,因为如果设置成∗*∗那么111就不会产生贡献。于是这段数字就只需要考虑去掉左右两边连续的111后的情况,也就是说最左边和左右边的数字一定不为1.原创 2020-12-12 19:24:10 · 257 阅读 · 0 评论 -
acm-(dp)Codeforces Round #688 (Div. 2) F. Even Harder
传送门设dp[i][j](j≥i)dp[i][j](j\ge i)dp[i][j](j≥i)表示到达iii点只有一条路径且满足能够到达iii点的这个唯一的点kkk能到达的最远点最多是jjj。于是不难写出方程dp[i][j+a[j]]=min{dp[i][j+a[j]],dp[j][i−1]+cnt[j][i−1]}dp[i][j+a[j]]=min\{dp[i][j+a[j]],dp[j][i-1]+cnt[j][i-1]\}dp[i][j+a[j]]=min{dp[i][j+a[j]],dp[j][.原创 2020-12-05 09:34:14 · 352 阅读 · 0 评论 -
acm-(好题、STL、dp、模拟)Educational Codeforces Round 99 (Rated for Div. 2) G. Forbidden Value
传送门考虑设dp[i][j]dp[i][j]dp[i][j]表示读完第iii行语句后,若xxx值为jjj所需要花费的最小代价。假设本题只有setsetset语句,那么我们不难发现,每当遇到语句set y vset\;y\;vsetyv时我们只需要更新∀j≠y,dp[i][j]+=v\forall j\ne y,dp[i][j]+=v∀j=y,dp[i][j]+=v以及dp[i][y]=mink{dp[i−1][k]}dp[i][y]=min_{k}\{dp[i-1][k]\}dp[i][y]=.原创 2020-12-04 20:38:41 · 182 阅读 · 0 评论 -
acm-(好题、动态规划)Codeforces Round #666 (Div. 1) C. Monster Invaders
传送门本题考虑设dp[i][0]dp[i][0]dp[i][0]表示打第iii关时bossbossboss只剩一滴血,且此时正好位于第iii关并即将前往第i+1i+1i+1关,而前i−1i-1i−1关所有怪物被清空所需要的最少时间。dp[i][1]dp[i][1]dp[i][1]表示前iii关所有怪物被清空(当前正在第iii关,即将前往第i+1i+1i+1关)所需要的最少时间。注意到如果有一关bossbossboss只剩一滴血,一定要去左边或者右边相邻的一个关卡,如果左边关卡的bossbossboss.原创 2020-12-04 16:54:17 · 354 阅读 · 0 评论 -
acm-(好题、思维、dp)Codeforces Round #687 (Div. 1) D. Cakes for Clones
传送门本题考虑设置两种状态:当1∼i−11\sim i-11∼i−1的蛋糕均已被收集,当前处于蛋糕iii所在位置(还没有收集蛋糕iii),并且分身处于闲置状态(即没有放在任何地方),对于到达这种情况我们所需要花费的最小时间设为mit[i]mit[i]mit[i]。当第iii个蛋糕恰好被收集,并且1∼i−11\sim i-11∼i−1的蛋糕已经被收集,分身位于第jjj个蛋糕处等待第jjj个蛋糕出现时,我们用dp[i][j]=0/1dp[i][j]=0/1dp[i][j]=0/1表示这种状态不可达或可.原创 2020-12-02 15:32:26 · 205 阅读 · 0 评论 -
acm-(最短路、有向图、思维)Codeforces Round #669 (Div. 2) E. Egor in the Republic of Dagestan
传送门本题让给出一个状态分配方案使得从111到nnn的最短路最大。考虑设dis[i][j]dis[i][j]dis[i][j]为从第iii个城市处于状态jjj(j=0,1j=0,1j=0,1)出发到达nnn城市的最短路的最大值,那么有方程dis[i][j]=minw[i][k]=j{max{dis[k][0],dis[k][1]}+1}dis[i][j]=min_{w[i][k]=j}\{max\{dis[k][0],dis[k][1]\}+1\}dis[i][j]=minw[i][k]=j{max.原创 2020-12-01 23:45:08 · 102 阅读 · 0 评论 -
acm-(dp、单调栈)Codeforces Round #669 (Div. 2) D. Discrete Centrifugal Jumps
传送门设dp[i]dp[i]dp[i]表示到达第iii个城市要的最小跳跃次数,首先只看1、21、21、2的转移条件,我们容易发现枚举iii的时候,一旦a[i−1]<a[i]a[i-1]<a[i]a[i−1]<a[i],那么dp[i−1]dp[i-1]dp[i−1]只会对dp[i]dp[i]dp[i]产生贡献,因为a[i]a[i]a[i]阻挡了从a[i−1]a[i-1]a[i−1]往后继续跳。不过对于前面第一个a[j]≥a[i]a[j]\ge a[i]a[j]≥a[i]的jjj,它是最左.原创 2020-12-01 23:35:31 · 107 阅读 · 0 评论 -
acm-(好题、网络流、状压dp)Educational Codeforces Round 96 (Rated for Div. 2) G. Yet Another DAG Problem
传送门本题有多种方法。方法一:采用状压dp,用SSS记录点集,我们考虑设dp[S]dp[S]dp[S]为一个合法的DAGDAGDAG点集SSS对应的最小答案。然后我们容易发现图中所有点的点权的范围一定可以位于[0,n−1][0,n-1][0,n−1],再大一定不会更优。而且由于是一个DAGDAGDAG,根据题意我们从DAGDAGDAG的入度为零的点出发沿着边走到终点,这个过程中遇到的点的点权一定是递减的。现在考虑dp[S]dp[S]dp[S]已经求解出来,那么如何用dp[S]dp[S]dp[S]去更.原创 2020-11-27 15:58:12 · 108 阅读 · 0 评论 -
acm-(好题、dp优化)Codeforces Global Round 11 C. The Hard Work of Paparazzi
传送门设dp[i]dp[i]dp[i]到第iii个人的时候最多已拜访人数(包括第iii个人),容易写出一个方程:dp[i]=max0≤j<i{dp[j]+[t[i]−t[j]≥d(i,j)]}dp[i]=max_{0\le j<i}\{dp[j]+[t[i]-t[j]\ge d(i,j)]\}dp[i]=max0≤j<i{dp[j]+[t[i]−t[j]≥d(i,j)]}。注意到ttt是单调递增的,意味着拜访次序大于2r2r2r的人之间的距离之差是小于它们的时间之差的,因为任意两个.原创 2020-11-27 08:22:23 · 140 阅读 · 0 评论 -
acm-(组合计数、dp计数)2020 China Collegiate Programming Contest Qinhuangdao Site H. Holy Sequence
传送门首先考虑对于数字jjj而言,如何计算贡献,假设它有xxx个,那么x2x^2x2等价于从整个序列中可以重复地选择两个数字jjj的选法。而所有x2x^2x2之和其实就是从所有可能的序列中重复地选择两个数字jjj的选法之和。总的来说,两个选法不同,要么两个选法中选择的两个位置存在差异,要么两个选法对应的序列存在差异,这样的话两个选法都会产生一次贡献。于是对于数字jjj而言,我们枚举它第一次出现在序列中的位置iii,设pre[i][j]pre[i][j]pre[i][j]表示长度为iii的序列,并且j.原创 2020-11-27 08:03:10 · 214 阅读 · 0 评论 -
acm-(多重背包)Codeforces Raif Round 1 (Div. 1 + Div. 2) G.Lucky Numbers
传送门本题主要就是让选kkk个数字,加起来等于nnn(询问),使得kkk个数字各位上的权值和最大。先看看权值的定义,对于第xxx位而言,若数字为3t(t=0,1,2,3)3t(t=0,1,2,3)3t(t=0,1,2,3),则权值为tFxtF_xtFx,且一旦分配,对应总和就会加上3t⋅10x3t\cdot 10^x3t⋅10x,如果将kkk个数字的第xxx位视为一个类型,并且不考虑那些无法被333整除的背包容量,那么选择分配权值的效果等价于从3k3k3k个大小为3⋅10x3\cdot 10^x3⋅.原创 2020-11-26 12:48:21 · 144 阅读 · 0 评论 -
acm-(贪心、dp)Educational Codeforces Round 96 (Rated for Div. 2) F. Realistic Gameplay
传送门本题有两种做法:dp、贪心。先说dp怎么做。设dp[i]dp[i]dp[i]表示第iii波及之前所消耗的最少子弹数。我们考虑在哪一波结束的时候换弹夹来更新dpdpdp数组,首先枚举最后一次换弹夹的波次iii,对于后面的波次j(j>i)j(j>i)j(j>i)而言,都保证波与波之间不换弹夹,也就是说只有子弹打空的时候再换弹夹,于是可以直接模拟jjj从i+1i+1i+1到nnn的消灭怪物的子弹变化情况,顺便可以更新dp[j]dp[j]dp[j],由于第iii波结束的时候更换了弹夹,.原创 2020-11-26 08:05:54 · 170 阅读 · 0 评论 -
acm-(分组背包、lcm)2020 China Collegiate Programming Contest, Weihai Site L. Clock Master
传送门本题就是让将nnn分解为若干数,然后让这些数的lcmlcmlcm最大。本质上来说,我们就是让选择一些pkp^kpk,使得它们之和为nnn,且乘积最大,这其实相当于分组背包,对于每一组而言,我们可以选0,p1,p2,...0,p^1,p^2,...0,p1,p2,...,最后选出来的总和为nnn,而求最大乘积,由于题目取了InInIn,事实上就是求最大InInIn和,方程可以写成dp[j]=max(dp[j],dp[j−pk]+In(k))dp[j]=max(dp[j],dp[j-p^k]+In(.原创 2020-11-24 07:45:04 · 160 阅读 · 0 评论 -
acm-(数位dp)2020ICPC·小米 网络选拔赛第二场 F.Modulo Nine
传送门首先转化一下题意,本质上就是要求ali∼ria_{l_i\sim r_i}ali∼ri中有至少2个"3",其中ai=9或0a_i=9或0ai=9或0代表aia_iai有2个"3",ai=3或6a_i=3或6ai=3或6代表aia_iai有1个"3",其它情况则只有0个"3"。考虑数位dpdpdp的思想,枚举数位,假设枚举到当前iii位置,考虑从iii位置向前数,第111个"3"位于jjj,第222个"3"位于kkk,此时的合法方案数为dp[i][j][k]dp[i][j][k]dp.原创 2020-11-23 07:43:16 · 221 阅读 · 0 评论 -
acm-(dp计数)Educational Codeforces Round 97 (Rated for Div. 2) F. Emotional Fishermen
传送门本题是让计算方案数,考虑如何设计dp的状态,注意到我们需要计数的排列的性质与前若干个元素的最大值有关。不妨先将aaa数组从小到大排个序,然后用dp[i][j]dp[i][j]dp[i][j]表示长度为iii的排列满足最大元素为aja_jaj且符合题目所述性质的方案数。这里分两种情况来计算方案数:首先我们考虑这个排列末尾的元素是多少,如果是aja_jaj,那么意味着前i−1i-1i−1个元素的最大值的两倍不能超过aja_jaj,不妨枚举这个最大值,假设hjh_jhj表示值的两倍不超过aja.原创 2020-11-07 11:33:38 · 255 阅读 · 0 评论 -
acm-dp相关优化学习笔记(决策单调性)
引言本文暂时只介绍与决策单调性有关的优化。后面会陆续完善其他优化一、决策单调性优化1.四边形不等式[1].定义设w[i][j]w[i][j]w[i][j]是一个二元函数,若∀a≤b≤c≤d\forall a\le b\le c\le d∀a≤b≤c≤d满足w[a][c]+w[b][d]≥w[a][d]+w[b][c]w[a][c]+w[b][d]\ge w[a][d]+w[b][c]w[a][c]+w[b][d]≥w[a][d]+w[b][c](可以记作交叉大于等于包含)成立,那么称w[i][原创 2020-11-04 10:17:11 · 366 阅读 · 2 评论 -
acm-(dp优化、决策单调性、背包)2020ICPC·小米 网络选拔赛第二场 H. Knapsack
传送门注意到www很小,我们考虑对www相同的物品分成一组,如果要从这一组中取kkk个物品,显然取价值前kkk大的物品是最优的,于是我们将重量为www的物品按照价值从大到小排个序,求个前缀和,得到sumw[]sum_w[]sumw[]数组,如果要从重量为www的物品中选kkk个的话对应的价值就是sumw[k]sum_w[k]sumw[k]。设dp[j]dp[j]dp[j]表示总重量不超过jjj时的最大价值,现在考虑重量为iii的物品如何去更新dp[]dp[]dp[]数组,我们不妨按照jjj模iii.原创 2020-11-03 20:10:06 · 530 阅读 · 1 评论 -
acm- (序列dp)Educational Codeforces Round 97 (Rated for Div. 2) C. Chef Monocarp
传送门本题就是让求sum[n]=∑i=1n∣ti−ai∣sum[n]=\sum_{i=1}^n|t_i-a_i|sum[n]=∑i=1n∣ti−ai∣,注意这里的tit_iti是已经由小到大排好序的,的最大值,并且要求1≤a1<a2<...<an1\le a_1<a_2<...<a_n1≤a1<a2<...<an。考虑动态规划,设dp[i][j]dp[i][j]dp[i][j]表示sum[i]sum[i]sum[i]在ai=ja_i=.原创 2020-10-28 09:59:21 · 222 阅读 · 0 评论 -
acm-(区间dp、回文串、子序列)ICPC SG Preliminary Contest 2018 C - Making Palindromes
kattis传送门vj传送门对于sss串而言,考虑设dp[i][j][k]dp[i][j][k]dp[i][j][k]表示所有长度为len=j−i+1+klen=j-i+1+klen=j−i+1+k的包含s[i∼j]s[i\sim j]s[i∼j]的子串为子序列的回文串的个数,其也等价于在s[i∼j]s[i\sim j]s[i∼j]的基础上再添加kkk个任意字符串使得字符串成为一个回文串的方案数,注意保证这些回文串两两不同,那么dp[1][n][n]dp[1][n][n]dp[1][n][n]即为答案.原创 2020-10-27 08:11:53 · 227 阅读 · 0 评论 -
acm-(动态规划,01串)Codeforces Round #672 (Div. 2) E. Battle Lemmings
传送门设0的总数为c,连续0的数目为l1,l2,...,lh\mathbf{l_1,l_2,...,l_h}l1,l2,...,lh(1~h代表不同的连续0段),那么ans=c(c−1)2−∑i=1hli(li−1)2\mathbf{ans=\frac {c(c-1)}2-\sum_{i=1}^{h}\frac {l_i(l_i-1)}2}ans=2c(c−1)−∑i=1h2li(li−1),要让ans最小,我们就要让∑i=1hli(li−1)2\mathbf{\sum_{i=1}^{h.原创 2020-09-27 09:38:31 · 132 阅读 · 0 评论 -
acm-动态规划题目集合
引言动态规划一直以来是acm中的一大热点,而且由于难度高的缘故,总是能结合其它算法出成一道综合难题。本文主要记录关于动态规划的各种题目,并给出详细地分析。动态规划有许多的类型,本文将题目分成若干个类型进行讲解序列dp例题一题目来源:2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)G题:选择题面:题解:设dp[i]表示从前i个数中挑选⌊i2⌋\mathbf{\lfloor \frac i2 \rfloor}⌊2i⌋个数的最大和。设sm[i]表示前i个数中下原创 2020-08-07 10:39:18 · 638 阅读 · 0 评论