dp的优化
文章平均质量分 74
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
CF1149B Three Religions(DP)
Link 注意到任何时刻s1,s2,s3s_1,s_2,s_3s1,s2,s3的长度不会多于250250250 那么定义f[i][j][k]f[i][j][k]f[i][j][k]表示当三个串分别匹配到i,j,ki,j,ki,j,k位置时,匹配到SSS串的最左端位置 这个预处理一个nxt[i][j]nxt[i][j]nxt[i][j]数字就很好转移了,表示[i+1,n][i+1,n][i+1,n]中最早出现字母jjj的位置 如果串s1,s2,s3s_1,s_2,s_3s1,s2,s3确定,这个f原创 2021-10-07 11:02:04 · 206 阅读 · 0 评论 -
229 D. Towers(单调性/单调队列dp)
LINK 定义f[i][j]f[i][j]f[i][j]表示前iii个数分割,最后一段是[j+1,i][j+1,i][j+1,i]合为一段 有转移,在满足后一段大于前一段的前提时有 f[i][j]=min{ f[j][k]+(i−j−1) }f[i][j]=\min\{\ f[j][k]+(i-j-1)\ \}f[i][j]=min{ f[j][k]+(i−j−1) } 注意到转移中的i−1i-1i−1可以被分离出来 f[i][j]=min{ f[j][原创 2021-09-30 10:36:31 · 218 阅读 · 0 评论 -
AtCoder Beginner Contest 207E - Mod i(前缀和,dp)
LINK 定义f[i][j]f[i][j]f[i][j]表示前iii个数分成jjj组的方案数 有转移 f[i][j]=∑(sumi−sumq)%j==0f[q][j−1]f[i][j]=\sum\limits_{(sum_i-sum_q)\%j==0}f[q][j-1]f[i][j]=(sumi−sumq)%j==0∑f[q][j−1] 时间复杂度为O(n3)O(n^3)O(n3) 考虑能转移的i,qi,qi,q满足sumi,sumqsum_i,sum_qsumi,sumq在模jjj意义下同余 那原创 2021-09-16 18:29:24 · 263 阅读 · 0 评论 -
AtCoder Beginner Contest 210 D - National Railway(枚举,优化)
LINK 选定节点(i,j)(i,j)(i,j)和(q,w)(q,w)(q,w),假定i<=q&&j<=wi<=q\&\&j<=wi<=q&&j<=w 那么代价为 Ai,j+Aq,w+C∗(q−i+w−j)A_{i,j}+A_{q,w}+C*(q-i+w-j)Ai,j+Aq,w+C∗(q−i+w−j) 其中(i,j)造成的代价为(i,j)造成的代价为(i,j)造成的代价为Ai,j−C∗(i+j)A_{i,j}-C*(i原创 2021-09-15 20:15:41 · 235 阅读 · 0 评论 -
AtCoder Beginner Contest 213G - Connectivity 2(状压dp神仙题)
LINK 题意 给定简单无向图 G=(V,E)G=(V,E)G=(V,E),点的编号从111到∣V∣=n|V|=n∣V∣=n.对于k=2..nk=2..nk=2..n,求 H=(V,E′⊆E)H=(V,E′⊆E)H=(V,E′⊆E) 的个数,使得 111 与 kkk 连通。 n≤17,m<=n∗(n−1)2n≤17,m<=\frac{n*(n-1)}{2}n≤17,m<=2n∗(n−1)。 考虑最后图的状态,点111和点kkk处于同一个连通块,这个连通块到其他点没有边 定义全集U=(1原创 2021-09-15 17:08:37 · 490 阅读 · 0 评论 -
AtCoder Beginner Contest 217 G - Groups(dp)
LINK 有nnn个人分为kkk组 其中两个人i,ji,ji,j如果满足i%m=j%mi\%m=j\%mi%m=j%m就不能分在一个组 求当k∈[1,n]k\in[1,n]k∈[1,n]时的方案数 定义f[i][j]f[i][j]f[i][j]表示前iii个人分成jjj组的方案数,我们每次只考虑第iii个人放在哪个位置 f[i][j]=f[i−1][j−1]+f[i−1][j]∗(j−⌊i−1m⌋)f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-\lfloor\frac{i-1}{m}\原创 2021-09-12 16:00:06 · 225 阅读 · 0 评论 -
Codeforces Global Round 14 E. Phoenix and Computers(组合数,dp)
LINK 灯=电脑 考虑最后的点灯状态,大概是一段连续的灯被手动打开,一个被动打开,一段连续的灯被打开… 再单独考虑打开一段连续长kkk的灯是怎么做到的 由于不能使任何一盏灯被动打开,唯一的策略是先打开其中的任意一盏灯,之后每次都选择左边和右边任意一盏没打开的灯去打开 于是方案数为2k−12^{k-1}2k−1 那么定义f[i][j]f[i][j]f[i][j]表示前iii盏灯,手动打开了jjj盏的方案数 f[i][j]=∑k=1i−jf[i−k−1][j−k]∗2k−1∗(jk)f[i][j]=\sum\原创 2021-09-03 20:26:51 · 239 阅读 · 0 评论 -
牛客练习赛87 E.贪吃蛇(构造矩阵快速幂)
LINK 考虑刚开局,我们让次大的蛇吃掉最大的蛇,次次大的蛇再吃掉原来次大的蛇… 这样最大蛇长累加到了n-1条蛇上,次大累加到n-2条蛇上…显然这样是最优的 操作一轮过后,原来最小的蛇变成最大的蛇 所以奇数轮我们倒序模拟(因为数组升序),偶数轮我们正序模拟(因为数组降序) 那么由于mmm的时间可以吃⌊mx⌋+1\lfloor \frac{m}{x} \rfloor+1⌊xm⌋+1次,最后剩下的那条蛇就是答案(因为主角可以开局可以选择任意的蛇) 看起来好像模拟⌊mx⌋+1\lfloor \frac{m}{x原创 2021-08-29 16:57:06 · 303 阅读 · 0 评论 -
2021牛客暑期多校训练营1 I.Increasing Subsequence(期望,维护后缀和优化dp)
LINK 可以定义f[i][j]f[i][j]f[i][j]表示第一个人上一次选的是pip_ipi,第二个人上一次选的是pjp_jpj,接下来游戏结束的期望值 Ⅰ.当pi<pjp_i<p_jpi<pj时,显然此时应该是第一个人在选数 f[i][j]=1+1c∑k>i&&pk>pjf[k][j]f[i][j]=1+\frac{1}{c}\sum\limits_{k>i\&\&p_k>p_j}f[k][j]f[i][j]=1+c1原创 2021-08-05 16:27:16 · 259 阅读 · 0 评论 -
45届ICPC亚洲区域赛(上海)C.Sum of Log(卡常数位dp)
LINK 若(x,y)(x,y)(x,y)满足x&y=0x\&y=0x&y=0那么可以被计算贡献 贡献为二进制位的最高位的位数 那么容易想到定义f[i][j][0/1][0/1]f[i][j][0/1][0/1]f[i][j][0/1][0/1]表示枚举到第iii位,最高位二进制111是jjj位置 xxx卡不卡上界,yyy卡不卡上界 这样乍一看是非常优秀的复杂度,然而实际上算一下发现极限数据是 302∗22∗105=3.6∗10830^2*2^2*10^5=3.6*10^8302∗2原创 2021-05-11 22:26:06 · 275 阅读 · 0 评论 -
(ICPC)亚洲区域赛(济南) L.Bit Sequence(数位dp,压缩状态)
LINK 乍一看觉得非常不可做,因为似乎找不到什么比较小的状态能判断是否满足条件 如果能找到这样的状态就简单了,在递归出口写个判断函数返回即可 观察到我们需要对i∈[0,m)i\in[0,m)i∈[0,m)判断f(x+i)==aif(x+i)==a_if(x+i)==ai x+ix+ix+i会不断进位,一旦进位就没完没了了 但是m<=100m<=100m<=100,也就是最多影响xxx的后777位二进制 换句话说,对于任意的i∈[0,m)i\in[0,m)i∈[0,m),无法就两种情况原创 2021-05-11 17:09:31 · 394 阅读 · 0 评论 -
P4983 忘情(wqs忘情二分)
LINK 为什么叫wqswqswqs二分呢?忘情二分显然更好听 题意 我们定义一段序列的值为 ((∑i=1nxi∗xˉ)+xˉ)2xˉ2\frac{((\sum\limits_{i=1}^nx_i*\bar x)+\bar x)^2}{\bar x^2}xˉ2((i=1∑nxi∗xˉ)+xˉ)2 给定一段长度为nnn的数组,分成mmm段,最小化每段的和值。 ((∑i=1nxi∗xˉ)+xˉ)2xˉ2=(1+∑i=1nxi)2=1+(∑i=1nxi)2+2∗∑i=1nxi \frac{((\sum\l原创 2021-05-02 17:00:05 · 254 阅读 · 0 评论 -
CF739E Gosha is hunting(wqs二分套wqs二分)
LINK 定义f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个神奇宝贝用了jjj个aaa球,kkk个bbb球的最大收益 很容易得到一个空间和时间都是O(n3)O(n^3)O(n3)的转移方程 #include <bits/stdc++.h> using namespace std; const int maxn = 3e5+10; int n,a,b; double p[maxn],u[maxn],f[509][509][509],ans; int main() {原创 2021-05-02 15:14:11 · 302 阅读 · 0 评论 -
P4072 [SDOI2016]征途(wqs二分+斜率优化)
LINK 把nnn个数划分为mmm段,求最小的方差. 设序列和∑i=1nxi=S\sum\limits_{i=1}^nx_i=Si=1∑nxi=S,最后选取的每段的数字和为LiL_iLi D=1m∗∑i=1m(E−Li)2=1m∑i=1m(E2+Li2−2E∗Li)D=\frac{1}{m}*\sum\limits_{i=1}^m(E-L_i)^2=\frac{1}{m}\sum\limits_{i=1}^m (E^2+L_i^2-2E*L_i)D=m1∗i=1∑m(E−Li)2=m1i=1原创 2021-05-01 22:35:07 · 268 阅读 · 0 评论 -
P4072 [SDOI2016]征途(斜率优化)
LINK 把nnn个数划分为mmm段,求最小的方差. 设序列和∑i=1nxi=S\sum\limits_{i=1}^nx_i=Si=1∑nxi=S,最后选取的每段的数字和为LiL_iLi D=1m∗∑i=1m(E−Li)2=1m∑i=1m(E2+Li2−2E∗Li)D=\frac{1}{m}*\sum\limits_{i=1}^m(E-L_i)^2=\frac{1}{m}\sum\limits_{i=1}^m (E^2+L_i^2-2E*L_i)D=m1∗i=1∑m(E−Li)2=m1i=1原创 2021-05-01 18:33:34 · 210 阅读 · 0 评论 -
P5785 [SDOI2012]任务安排(斜率优化+二分下凸壳)
LINK f[i]=min{f[j]+s∗(sumcn−sumcj)+sumti∗(sumci−sumcj)}f[i]=\min\{f[j]+s*(sumc_n-sumc_j)+sumt_i*(sumc_i-sumc_j)\}f[i]=min{f[j]+s∗(sumcn−sumcj)+sumti∗(sumci−sumcj)} sumti∗sumcj+f[i]−sumci∗sumti−s∗sumtn=f[j]−s∗sumcjsumt_i*sumc_j+f[i]-sumc_i*sumt_i-s*su原创 2021-04-30 22:02:34 · 229 阅读 · 1 评论 -
WQS二分/带权二分/凸优化DP
nnn个物品,限定选择mmm个物品求最大/最小权值。 当然具体怎么计算权值按照题目的意思来定 设g(x)g(x)g(x)表示强制选择xxx个物品能得到的最大权值 且(x,g(x))(x,g(x))(x,g(x))在平面上形成一个凸函数,就可以使用wqswqswqs二分 思想是,我们知道这个凸包的大概形状,但是不知道具体的点(x,g(x))(x,g(x))(x,g(x))(直接求复杂度高) 考虑用一条斜率为kkk的直线去切这个凸包,可以得到一个切点,满足过这个切点截距最大 设这条直线是y=kx+by=kx原创 2021-04-30 20:28:52 · 314 阅读 · 1 评论 -
P3628 [APIO2010]特别行动队(简单斜率优化)
LINK 题意 nnn名士兵,你需要把士兵分成连续的一段一段特别行动队 设其中一队的战斗力和为xxx,那么修正战斗力是ax2+bx+cax^2+bx+cax2+bx+c(当然a<0a<0a<0) 求一种分组方式,使得修正战斗力之和最大 转移方程为 f[i]=f[j]+a∗(sumi−sumj)2+b∗(sumi−sumj)+cf[i]=f[j]+a*(sum_i-sum_j)^2+b*(sum_i-sum_j)+cf[i]=f[j]+a∗(sumi−sumj)2+b∗(sumi−s原创 2021-04-29 17:43:27 · 266 阅读 · 0 评论 -
P4360 [CEOI2004]锯木厂选址(枚举+斜率优化)
LINK 题意 山脚下有一个锯木厂,有nnn棵树,只能从山顶往山脚方向走 给出每棵树距离山脚的距离,你可在在任意位置修建两个锯木厂 求所有树运输到锯木厂的花费最小值. 考虑枚举第二个锯木厂建在iii位置(编号越小,距离山顶越近) 定义f[i]f[i]f[i]表示第二个锯木厂建在iii位置的最小花费 dis[i]dis[i]dis[i]表示运输到山脚的距离和,tottottot为一开始所有树运输到山脚的花费 sum[i]sum[i]sum[i]表示树重量的前缀和(山顶的树在前) f[i]=min{tot−原创 2021-04-29 15:13:33 · 551 阅读 · 0 评论 -
P2627 [USACO11OPEN]Mowing the Lawn G(单调队列优化dp)
LINK 定义f[i]f[i]f[i]表示前iii头奶牛不选第iii头奶牛的最大收益 那么f[i]=max{f[j]+sumi−1−sumj}f[i]=\max\{f[j]+sum_{i-1}-sum_{j}\}f[i]=max{f[j]+sumi−1−sumj} 其中j∈[i−k−2,i−1]j\in[i-k-2,i-1]j∈[i−k−2,i−1] 发现sumi−1sum_{i-1}sumi−1固定,求的是f[j]−sumjf[j]-sum_jf[j]−sumj的最小值 这个可以用线段树处理,但原创 2021-04-29 10:09:05 · 270 阅读 · 0 评论