![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
gjghfd
这个作者很懒,什么都没留下…
展开
-
[ 状压DP ] [ Snoi2013 ] BZOJ3590 Quare
一个双连通图一定可以由一个点不断套上环形成。那么考虑DP,可以每次选一条链,然后两端和原集合连起来更新。 设 fSfSf_S 表示集合 SSS 的答案。 因为要选一条链,所以还要维护 h[S][x][y]h[S][x][y]h[S][x][y] 表示把 SSS 集合中的点连成一条链,两端为 xxx 和 yyy 的最小代价, hhh 可以DP求出。 由于要和原集合连起来,再求出 g[S][x]...原创 2018-05-16 10:52:49 · 347 阅读 · 0 评论 -
[ DP CDQ分治 ] BZOJ4553
设 li" role="presentation" style="position: relative;">lilil_i 表示 ai" role="presentation" style="position: relative;">aiaia_i 可以变成的最小值, ri" role="presentation" style="position: relative;">ririr_i 表示最大值原创 2018-01-27 11:30:41 · 273 阅读 · 0 评论 -
[ DP ] [ POI2007 ] BZOJ1109
先考虑 O(n2)" role="presentation" style="position: relative;">O(n2)O(n2)O(n^2) 的DP: 令 fi" role="presentation" style="position: relative;">fifif_i 为使 i" role="presentation" style="position: relative;">ii原创 2018-01-25 19:05:48 · 168 阅读 · 0 评论 -
[ 插头DP ] BZOJ1814
%%%g1n0st可以看cdq的ppt#includeusing namespace std;typedef long long ll;const int N=13;const int M=200000;int k,n,m;char s[N];bool c[N][N],b;int h[2][M],nx[2][M],t[2][M],tot[2];int p[N1];int原创 2018-01-08 14:58:14 · 289 阅读 · 0 评论 -
[ DP ] [ POI2006 ] BZOJ1442
从高到低枚举每一个二进制位考虑。 如果有某个 ai" role="presentation" style="position: relative;">aiaia_i 这一位等于 1" role="presentation" style="position: relative;">111 ,而 xi" role="presentation" style="position: relative;">原创 2018-01-31 16:01:43 · 188 阅读 · 0 评论 -
[ 插头DP ] [ SCOI2010 ] BZOJ2331
%%%g1n0st#includeusing namespace std;const int N=110;const int M=20110520;int j,k,n,m;int p[N],Ans;bool b[N][N];char s[N];vectorint>f[N][11];inline void Add(int& x,int y){ x=(x+y)%M;原创 2018-01-07 19:04:30 · 161 阅读 · 0 评论 -
[ 数论 ] [ DP ] BZOJ3462
设 S=∏i=1kpi,n=∑xipi" role="presentation" style="position: relative;">S=∏ki=1pi,n=∑xipiS=∏i=1kpi,n=∑xipiS=\prod_{i=1}^k p_i ,n=\sum x_ip_i 。 可以发现 k" role="presentation" style="position:原创 2018-01-30 19:38:22 · 263 阅读 · 0 评论 -
[ DP NTT ] [ SDOI2015 ] BZOJ3992
令 fi,jf_{i,j} 表示前 ii 个数乘积为 jj 的方案数。然后可以写出DP方程。 由于 mm 是质数,可以用原根使乘法转换为加法,然后用快速幂+NTT加速即可。#includeusing namespace std;const int N=16400;const int P=1004535809;const int G=3;int k,n,m,p,M;int in原创 2018-01-22 14:56:45 · 171 阅读 · 0 评论 -
[ 树形DP ] BZOJ4987
显然最终路径不可能跳过一个没取过的点。 记 33 个数组分别表示两端在根、一端在根、两端都不在根的有 ii 个点的路径长度最小值。 然后做一次树形背包即可。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=3010;const in原创 2018-01-02 18:44:11 · 320 阅读 · 0 评论 -
[ Lucas定理 数位DP 容斥 ] 「2015 计蒜之道 复赛」360的产品试用体验
题解#include<bits/stdc++.h>using namespace std;const int M=47;typedef long long ll;int k,T,m,p[3];int f[20][3][8][150];ll a[5],l[5],r[5],n;int A[3][20],B[20];int w[20],cnt,Ans;int mx[3][20];int原创 2017-12-15 17:55:28 · 259 阅读 · 0 评论 -
[ DP ] [ HNOI2012 ] BZOJ2734
考虑这样一个矩阵: 1 3 9 27 2 6 18 54 4 12 36 108 那么问题就变成了在这个矩阵中选几个数,相邻的数不能选。 由于列数最多只有 11" role="presentation" style="position: relative;">111111 ,可以状压DP 。 然后发现有些数不在这个矩阵中。再将这些数分别作为矩阵左上角做一遍,由于矩阵间互不影响原创 2018-01-29 13:35:04 · 198 阅读 · 0 评论 -
[ AC自动机 数位DP ] [ SDOI2014 ] BZOJ3530
将所有串建成AC自动机。 设 f[i][j][0/1][0/1]" role="presentation" style="position: relative;">f[i][j][0/1][0/1]f[i][j][0/1][0/1]f[i][j][0/1][0/1] 表示做到第 i" role="presentation" style="position: relative;">iii 位,匹配原创 2018-01-29 15:49:01 · 208 阅读 · 0 评论 -
[ DP ] Codeforces938F Erasing Substrings
显然肯定有一种方案使删的每一段子串在原字符串中是互不包含的,因为包含和相邻是等价的。 那么有一个简单的DP: 设 fi,jfi,jf_{i,j} 表示删完后还有 iii 位,已删除的长度为 jjj 时的最优答案。 由于 fi,jfi,jf_{i,j} 是个字符串,这样复杂度是 O(n3logn)O(n3logn)O(n^3\log n) 的。 然后考虑能否不记字符串。注意到每个状态都是答...原创 2018-02-24 19:40:14 · 528 阅读 · 0 评论 -
[ DP FWT 链分治 ] [ SDOI2017 ] BZOJ4911 切树游戏
题解#include<bits/stdc++.h>using namespace std;char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}...原创 2018-05-17 10:20:51 · 493 阅读 · 0 评论 -
[ wqs二分 ] Codeforces958E2 Guard Duty (medium)
裸的wqs二分。#include<bits/stdc++.h>using namespace std;const int N=500010;int k,n,m;int a[N];int s[N];double f[N];int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) ...原创 2018-04-17 15:02:48 · 540 阅读 · 0 评论 -
[ 树形DP 贪心 ] Codeforces958B2 Maximum Control (medium)
可以发现最优的选点方案一定包含直径的 222 个端点,而且选的一定是叶子节点。 把直径的一个端点作为根,那么所有方案都会选根。这样每次多选一个点都是一段从叶子向根的路径。记下所有路径,每次取最大值就好了。#include<bits/stdc++.h>using namespace std;const int N=100010;int k,n,m,x,y;int h[N],...原创 2018-04-17 13:45:56 · 278 阅读 · 0 评论 -
[ 背包 ] VK Cup 2018 - Round 2 Codeforces924E Wardrobe
容易发现答案一定可以表示成是一段 b[i]=0、一段 b[i]=1 、一段 b[i]=0 。 先对问题做一个转化:将下端在 [ l,r ] 改为上端在 [ max-r,max-l ] ,相当于将原答案反过来。然后可以发现对于两个 b[i] 相等的相邻块,a[i] 大的在下面一定比 a[i] 小的在下面优,因为这样会使 2 个上端更加接近而不会改变总高度。 将所有块按照 b[i] 从小到大排序,...原创 2018-03-28 20:48:05 · 310 阅读 · 0 评论 -
[ 决策单调性优化DP ] 计蒜客 是男人就过 8 题 H Sign Location
%%%LargestJN显然标志放在车站上是最优的。 令 fi,jfi,jf_{i,j} 表示放了前 iii 个标志,最后一个标志在 jjj 位置的最小代价,转移推下式子就行了。 打个暴力发现满足决策单调性,分治做就好了。 讲下怎么推式子。 最终 kkk 个标志把 nnn 个车站分成了 k+1k+1k+1 个区间,我们把 (i,j)(i,j)(i,j) 的贡献算在 iii 所在的区间内...原创 2018-03-27 12:58:07 · 789 阅读 · 5 评论 -
[ 分治 决策单调性优化DP ] LOJ#6039. 「雅礼集训 2017 Day5」珠宝
设 fi,jfi,jf_{i,j} 表示售价 ≤i≤i\le i 的珠宝,使用 jjj 万元的最大吸引力。转移方程很容易写出。 因为售价相同的珠宝肯定是从最大吸引力开始取的,所以转移的函数是上凸的。 将 jjj 按 j mod ij mod ij~mod~i 分类,每一类的转移满足决策单调性,然后就可以用分治做了。 时间复杂度 O(maxciklogk...原创 2018-03-14 09:46:05 · 805 阅读 · 0 评论 -
[ DP 莫队 ]「2017 山东一轮集训 Day6」LOJ#6074 子序列
题解#include<bits/stdc++.h>using namespace std;const int SZ=1<<25; char nc() { static char buf[SZ],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,SZ,stdin),p...原创 2018-03-13 15:26:50 · 527 阅读 · 1 评论 -
[ DP ] Codeforces889E Mod Mod Mod
设 xi=xi−1 mod ai(x>1),x1=xxi=xi−1 mod ai(x>1),x1=xx_i=x_{i-1} ~mod~a_i(x>1),x_{1}=x ,即 xxx 依次对前 iii 个数取模后的值。 设 ansi=f(x,1)−f(xi,i+1)ansi=f(x,1)−f(xi,i+1)ans_i=f(x,1)-f(x_i,i...原创 2018-03-04 10:43:12 · 569 阅读 · 0 评论 -
[ DP KMP 矩乘优化 ] Codeforces946F Fibonacci String Subsequences
先对原串做一次KMP。 先考虑朴素的DP: 设 fi,jfi,jf_{i,j} 表示 F(x)F(x)F(x) 的前 iii 个字符能匹配到 sss 串第 jjj 位的方案数,结合KMP就可以转移了。 把状态用矩阵表示,对每个 F(i)F(i)F(i) 求出答案矩阵和转移矩阵,就可以递推求出答案了。#include<bits/stdc++.h>using namespace...原创 2018-03-07 13:39:32 · 352 阅读 · 0 评论 -
[ DP ] BZOJ3791
2种颜色,染色 kk 次最多可以把序列变成 2k−12k-1 段,因为可以在一次染色后的区间内再用不同颜色染一次,使段数加2。 fi,j,kf_{i,j,k} 表示前 ii 个数,染了 jj 次,最后一次颜色是 kk 的答案,直接转移就好了。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using原创 2017-11-26 14:43:53 · 272 阅读 · 0 评论 -
bzoj1009 [ HNOI2008 ] -- KMP+矩阵乘法加速DP
令f[i][j]表示前i个字符,匹配到不吉利数字的第j位的方案数。枚举第i+1位,通过KMP求出前i+1个字符可以匹配到不吉利数字的第几位,递推。但由于n9,要用矩阵乘法加速。f[i][j]=a[j][0]*f[i-1][0]+a[j][1]*f[i-1][1]+...+a[j][m-1]*f[i-1][m-1]那么f[n]就是 an×f[0]用快速幂,时间复杂度为O(log2n*m3)原创 2017-05-26 16:43:59 · 320 阅读 · 0 评论 -
Codeforces868F Yet Another Minimization Problem -- 决策单调性优化DP
令 fi,jf_{i,j} 表示前 ii 个数分成 jj 个区间的最小值,这样很容易列出DP方程。 然后发现可以用决策单调性优化。 注意分治的时候要将 [L,l−1][L,l-1] 的值预处理出来,其中[l,r][l,r]表示当前区间,[L,R][L,R]表示转移的区间。 时间复杂度O(knlogn)O(kn\log n)#include<cstdio>#include<cstring>#原创 2017-10-06 16:48:18 · 897 阅读 · 0 评论 -
bzoj3687 -- bitset优化DP
令fif_i表示子集和是ii的方案数,枚举ii,fi+=fi−aif_i+=f_{i-a_i}。 显然只有当fif_i是奇数时可以记入答案,那么fif_i就可以用bitsetbitset优化,更新时f=f xor f>>aif=f~xor~f>>a_i就可以了。代码:#include<iostream>#include<cstdio>#include<cstring>#include<alg原创 2017-07-05 17:19:52 · 296 阅读 · 0 评论 -
bzoj4742 [Usaco2016 Dec] -- DP
令fi,j,kf_{i,j,k}表示约翰在前ii中选kk个,保罗在前jj个中选kk个,约翰打败保罗的方案数,aia_i表示约翰的第ii只牛,bib_i表示保罗的第ii只牛。就可以列出方程:fi,j,k=fi−1,j,k+fi,j−1,k−fi−1,j−1,k+[ai>bj]∗fi−1,j−1,k−1f_{i,j,k}=f_{i-1,j,k}+f_{i,j-1,k}-f_{i-1,j-1,k}+[a_原创 2017-06-10 18:43:07 · 308 阅读 · 0 评论 -
codeforces802 J&&K Send the Fool Further! (easy&&medium) -- 树形DP
题目大意:给定一棵树,求从根开始经过所有点次数不大于k的路径的最大长度(经过一条边多次只计算一次长度)。显然一颗子树最多只会经过一次。 令f[i]表示以i为根的子树中的答案,g[i]表示在以i为根的子树中,最终点在i的答案,dist[i]表示第i个点与他父亲的距离。 那么g[i]就等于所有儿子的最大k-1个g+dist之和。 求f[i]时,枚举每个儿子j,将以j为根作为最终点,用g[i]+f[原创 2017-05-30 17:08:00 · 859 阅读 · 0 评论 -
bzoj4518 [ SDOI2016 ] --斜率优化DP
设x[i]为第i天走的路程,s为路程总和,则:ans=[(s/m-x[1])^2+(s/m-x[2])^2+(s/m-x[3])^2+...+(s/m-x[m])^2]*m =[(s-x[1]*m)^2+(s-x[2]*m)^2+(s-x[3]*m)^2]+...+(s-x[m]*m)^2)]/m =s^2+m*(x[1]^2+x[2]^2+x[3]^2+...+x[m]^2原创 2017-05-26 16:40:40 · 232 阅读 · 0 评论 -
bzoj1584 [ Usaco2009 Mar ] --DP
题目大意:有N头奶牛,每头那牛都有一个标号Pi,1 思路:显然如果连续的一段数字相同,我们可以把它们合并成一个数字。用f[i]表示在1~i这一段的最小不河蟹度。因为答案最大为n,显然不可能出现一段中有超过sqrt(n)个不同的数。定义b[j],使b[j]+1~i中不同的数的个数等于j且b[j]最小,那么可以得到:f[i]=min{f[j]+j*j},j怎么求b[j]呢?定义p[k]表示原创 2017-05-26 16:41:41 · 232 阅读 · 0 评论 -
bzoj1042 [ HAOI2008 ] --容斥原理+完全背包
题目大意:硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。其中di,s思路:先用完全背包求出如果每种硬币可以用无数次的方案数,再容斥一下就好了。具体看代码。代码: 1 #include 2 #include 3 #include 4 #include 5 using原创 2017-05-26 16:41:50 · 186 阅读 · 0 评论 -
bzoj1492 [ NOI2007 ] --斜率优化DP+cdq分治
显然在某一天要么花完所有钱,要么不花钱。所以首先想到O(n^2)DP:f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j其中f[j]*r[j]/(a[j]*r[j]+b[j])是第j天最多能买多少A券,B类似。假如我们已经找到了最优的j,那么有f[i]=(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]原创 2017-05-26 16:42:10 · 292 阅读 · 0 评论 -
bzoj2669 [ CQOI2012 ] -- DP+容斥
假设我们可以求出当a[1]..a[i]是局部最小值而其它点不加限制时的方案数,那么显然可以通过容斥求出答案。那么怎么求当一些点是局部最小值时的方案数呢?考虑DP。将数字从小到大放。令f[i][j]表示已经放了i个数,局部最小值的点的状态为j时的方案数,可得到方程:f[i][j]=Σf[i-1][j]*cnt[j-(i-1)]+f[i-1][j^k](k&j>0)其中cnt[j]表示当局部最原创 2017-05-26 16:42:35 · 468 阅读 · 1 评论 -
bzoj1911 [ APIO2010 ] -- 斜率优化DP
简单的斜率优化。首先得到DP方程:f[i]=max(f[j]+a*(sum[i]-sum[j])2+b*(sum[i]-sum[j])+c),j其中sum表示前缀和设j比k优f[j]+a*(sum[i]-sum[j])2+b*(sum[i]-sum[j])+c>f[k]+a*(sum[i]-sum[k])2+b*(sum[i]-sum[k])+cf[j]+a*s[j]2-b*s[j]-原创 2017-05-26 16:42:58 · 206 阅读 · 0 评论 -
codeforces822E Liar -- DP+Hash
令fi,jf_{i,j}表示ss串前ii位分成jj块最多能匹配到tt的第几位。 对于fi,jf_{i,j},可以更新:fi+1,j=max(fi+1,j,fi,j)f_{i+1,j}=\max (f_{i+1,j},f_{i,j})fi+lcp,j+1=max(fi+lcp,j+1,fi,j+lcp)f_{i+lcp,j+1}=\max (f_{i+lcp,j+1},f_{i,j}+lcp)原创 2017-07-08 17:06:51 · 694 阅读 · 0 评论 -
codeforces833B The Bakery -- DP + 线段树
考虑DP。令fi,j表示前i 个盒子装前 j 个蛋糕的答案: fi,j=max(fi−1,k+vk+1,j),k∈[1,i−1]其中vi,jv_{i,j}表示第 i 个蛋糕到第 j 个蛋糕装在同一个盒子里的权值。 但这样是O(n2k)的,然后我们考虑用线段树优化原创 2017-07-31 09:04:58 · 501 阅读 · 2 评论 -
bzoj3675 [ APIO2014 ] -- 斜率优化DP
令fi,jf_{i,j}表示前 jj 个数分割 ii 次的答案,sis_i表示前缀和。可以得到DPDP方程: fi,j=max(fi−1,k+sk×(si−sk)),k<jf_{i,j}=max(f_{i-1,k}+s_k\times (s_i-s_k)),k<j 然后考虑斜率优化。 j<kj<k且 jj 比 kk 优的条件是: fi−1,j+sj×(si−sj)>fi−1,k+sk×(si原创 2017-08-19 22:03:08 · 281 阅读 · 0 评论 -
Codeforces868E Policeman and a Tree -- DP
令 fu,v,s1,s2f_{u,v,s_1,s_2} 表示当前在第 uu 个点,将要走到第 vv 个点,前面有 s1s_1 个罪犯,后面有 s2s_2 个罪犯,将所有罪犯抓到的最小时间。 那么如果 vv 是叶子,下一步可以直接抓到 s1s_1 个罪犯,从 fv,u,s2,0f_{v,u,s_2,0} 转移。 否则,考虑在 TT 时间内是否可以抓到: 判断是否存在一种方案,将 s1s_1 个罪原创 2017-10-10 20:46:24 · 471 阅读 · 0 评论 -
[ DP 树状数组 dfs序 倍增 ] Codeforces856D Masha and Cactus
%%%LargestJN 令 fif_i 表示点 ii 子树的答案,sis_i 表示点 ii 所有儿子的答案减去 fif_i。 假如点 ii 不在环上,答案就是 ii 的所有儿子的 ff 和。 假如点 ii 在环上,对于所有LCA是 ii 的边 (x,y)(x,y),假如选了这条边,答案就是 xx 到 ii , yy 到 ii 路径上 sjs_j 之和加上点 ii 所有儿子的答案之和。原创 2017-10-18 15:33:54 · 340 阅读 · 0 评论 -
bzoj3672 [ NOI2014 ] -- 树上CDQ分治 + 斜率优化DP
神题题解代码#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define N 200010#define Eps 1e-15#define ll long longinline char nc(){ static char buf[100000原创 2017-09-21 20:32:41 · 292 阅读 · 0 评论