DP
LowestJN
强省弱OIer
展开
-
[莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
如果只考虑求一个数列的不同子序列个数,可以简单地DP出来fi=2×fi−1−flstai−1f_{i}=2\times f_{i-1}-f_{lst_{a_i}-1},其中 lstjlst_j 表示字符 jj 上次出现的位置,没出现过就忽略但是这样不好维护可以换一种DP方式,fi,jf_{i,j} 表示以字符 ii 开头,字符 jj 结尾的子序列个数。那么在左边新加一个字符 xx ,fx,if_{x原创 2017-10-12 18:20:11 · 1029 阅读 · 0 评论 -
[BZOJ Contest-2017省队十连测推广赛2·T3][BZOJ4256][DP][Tarjan]推箱子
老师找来的题解 这里摘一下好了…并不知道出题人是谁考虑相邻的两块空地之间连边,这样就得到一个无向图,在这张图上DP 在最后时刻,箱子肯定在目标处,人在箱子的四周的其中一个空地上 倒过来考虑就有两种情况 1. 人动箱子不动。 2. 如果人在箱子4周相邻的格子中,人拉着箱子动。令f[i][j][0..3]表示是否存在箱子在(i,j)人在箱子的其中一侧(0..3表示在那一侧)的方案。 那么f[原创 2017-03-23 21:19:39 · 925 阅读 · 2 评论 -
[数位DP 多重背包计数] BZOJ5003. 与链
每一位二进制分开考虑那么在一个合法的序列中,一定是前面几个数当前二进制位是1,其他都是0数位DP,每一位的1最多出现k次,这就是一个多重背包多重背包转移用前缀和优化就好了O(nlogn)O(n\log n)#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010,P原创 2017-11-26 11:02:49 · 569 阅读 · 0 评论 -
[DP 组合] BZOJ5004 & Hihocoder1075. 开锁魔法 III
ii 向 aia_i 连边,会形成若干个环那么把钥匙分配给这些环的概率就是答案DPfi,jf_{i,j} 表示前 ii 个环都打开了,还剩下 jj 把钥匙的概率fi,j=fi−1,k×(sizeik−j)(n−sizeij)(nk)f_{i,j}={f_{i-1,k}\times {size_i\choose k-j}{n-size_i\choose j}\over{n\choose k}}这样DP原创 2017-11-26 13:07:23 · 463 阅读 · 0 评论 -
[状压DP] TopCoderSRM549 DIV1 600. MagicalHats
对帽子状压,0表示没选过,1表示选过但是没有硬币,2表示选过且存在硬币。 可以先dp出每一种情况是否合法,然后dp显然只要DP出最多能得到几个硬币就好了(magician肯定会从小到大给你硬币) 对于状态S,枚举选择哪个帽子,magician会在“在这个帽子里放硬币”和“在这个帽子里不放硬币”选择较小的。记忆化搜索一下// BEGIN CUT HERE // END CUT HERE #l原创 2017-12-14 13:04:28 · 500 阅读 · 0 评论 -
[DP] TopCoder SRM548 Div1 450. KingdomAndDice
把B排序一遍,然后记忆化搜索一下用 fx,y,k,zf_{x,y,k,z} 表示a数组中第x个零,枚举到 b[y]+kb[y]+k,且 ai>aja_i>a_j 的点对 (i,j)(i,j) 有z个的情况是否可行,这样数组大小是50*50*50*2500的, bitset存一下就好了…没打过这么暴力的程序#include <cstdio>#include <iostream>#include原创 2017-12-11 20:33:37 · 509 阅读 · 0 评论 -
[计数 DP]Atcoder AGC001 E. BBQ Hard
答案是求 ∑i≠j(ai+aj+bi+bjai+aj)\sum_{i\neq j}{a_i+a_j+b_i+b_j\choose a_i+a_j}这就相当于从平面内的 (−ai,−bi)(-a_i,-b_i) 走到 (aj,bj)(a_j,b_j) 的方案数把点放到平面上,DP就好了#include <cstdio>#include <iostream>#include <algorithm>原创 2017-12-06 20:47:43 · 444 阅读 · 0 评论 -
[DP] 「CodePlus 2017 11 月赛」找爸爸
类似最长公共的DP fi,j,k,sf_{i,j,k,s} 表示匹配到A的第i位,B的第j位,k表示A的第i是之前是否有0,s表示B的第j位之前是否有0瞎转移一下#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>using namespace std;const int N=3010;char原创 2017-11-26 21:14:48 · 528 阅读 · 0 评论 -
[二维区间DP?] Atcoder ARC004E. Salvage Robots
可以让出口移动,robots不动 fu,d,l,rf_{u,d,l,r} 表示出口活动的区域为 (x−u,y−l)(x-u,y-l) 到 (x+d,y+r)(x+d,y+r) 这个矩形时最多能救多少机器人。转移的话,画画图可以知道哪些区域求不了#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>u原创 2017-12-14 21:30:14 · 478 阅读 · 0 评论 -
[启发式合并 DP] Atcoder ARC086E. Smuggling Marbles
比赛的时候想到了每层独立,但是不会搞…官方题解好像学到了关于深度的信息启发式合并的次数是 O(n)O(n) 的… 还有deque这种神奇的东西……像我以前都是set加上各种外层的标记……果然还是太弱了#include <cstdio>#include <iostream>#include <algorithm>#include <queue>using namespace std;typed原创 2017-12-11 20:37:41 · 1006 阅读 · 0 评论 -
[虚树] BZOJ3611: [Heoi2014]大工程
虚树裸题#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N=1000010;int n,m,cnt,t,G[N],l[N],r[N],dpt[N];struct edge{ int t,nx;}E[N<<1];inline原创 2017-12-02 16:17:27 · 296 阅读 · 0 评论 -
[几何 区间DP] Codeforces 438C & 437E. The Child and Polygon
题目是求三角剖分个数令 fi,jf_{i,j} 表示 i∼ji\sim j 这些点组成的多边形的三角剖分方案数我们找到一个点 kk,让 i,j,ki,j,k 形成一个三角形,那么 fi,j=∑fi,k×fk,jf_{i,j}=\sum f_{i,k}\times f_{k,j}那么让 kk 在向量 ij→\vec{i j} 的顺时针方向或逆时针方向就不会有重复且合法了#include <cstdio原创 2017-10-26 10:58:58 · 434 阅读 · 0 评论 -
[wqs二分 DP] Codeforcces 739E. Gosha is hunting
看CF上的博客吧#include <cstdio>#include <iostream>#include <algorithm>#define fi first#define se secondusing namespace std;const int N=100010;int n,x,y;double a[N],b[N];inline pair<int,int> solve(double原创 2017-11-07 15:21:20 · 440 阅读 · 0 评论 -
[wqs二分 DP] POJ1160. Post Office
一样的套路有一个office数量为 pp 的限制很烦,当设一个office时,我们增加一个价值 xx ,然后直接无视office数量的限制DP,显然 xx 越大,最优解的office数量越小,二分一下就好了瞎DP是O(n2logn)O(n^2\log n) 的,DP也可以用决策单调优化#include <cstdio>#include <iostream>#include <algorithm>原创 2017-11-07 21:31:34 · 1216 阅读 · 0 评论 -
[后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
fi,jf_{i,j} 表示前 ii 个串,以 jj 结尾的可接受的字符串的个数。那么DP的转移可以用后缀自动机转移#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=4000010,P=1e9+7;int n,cnt=1,len;i原创 2017-10-13 07:58:57 · 855 阅读 · 0 评论 -
[回文自动机优化转移] Central Europe Regional Contest 2014 G. Virus synthesis
一个可行的方案肯定是把一个回文串前后加上一些字符变成 SS 那么只要能DP出每个回文字串的方案就可以了,令这个方案为 ff如果一个回文串长度为奇数,那么它可以由 f去掉两端后的串+2f_\text{去掉两端后的串}+2 和 f最长回文后缀+leni−len最长回文后缀f_\text{最长回文后缀}+len_{i}-len_\text{最长回文后缀} 中的最小值转移过来。如果是偶数,那么它可以由 f去原创 2017-10-14 11:10:48 · 419 阅读 · 0 评论 -
[二分答案 DP检验 几何] BalkanOI 2017. Cruise
题意是给定平面内2000给点(都在y轴右边),要选出一些点,和原点组成多边形,求在多边形内的点的点权和除以多边形周长的最大值。分数规划,二分答案∑wi∑disi,j≥mid{\sum w_i\over \sum dis_{i,j}}\ge mid∑w−mid∑disi,j≥0\sum w-mid\sum dis_{i,j}\ge 0这样求∑w−mid∑disi,j\sum w-mid\sum dis原创 2017-10-31 11:40:05 · 586 阅读 · 1 评论 -
[DP] BalkanOI 2016. Lefkaritika
题意大概是有求多少个不包含关键点的边长为整数的正方形。转化一下就是求对于每个点 (x,y)(x,y) ,以它为左上角的不包括关键点的正方形的边长最大值,令为 f(x,y)f(x,y)答案就是 ∑f(x,y)\sum f(x,y)考虑对于每条对角线上的点单独处理设当前点为 (i,j)(i,j) ,设 i′i' 是最小的满足 (i′,j)(i',j) 为关键点且 i′>ii'>i的值,j′j' 是最小的原创 2017-10-31 11:42:04 · 422 阅读 · 0 评论 -
[DP] BZOJ4321. queue2
fi,j,kf_{i,j,k} 表示由前 ii 个人组成,有 jj 对人是相邻的,ii 与 i−1i-1 是否相邻DP的话直接分类讨论转移就行了#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <string>using namespace std;const int N=1原创 2017-10-31 20:29:10 · 481 阅读 · 0 评论 -
[容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
考虑从小到大加入一个数,加入 ii 时会增加大于0小于 ii 对逆序对那么就相当于求 ∑ai=k\sum a_{i} = k 的方案数,其中 ai<ia_i<i这就是个很经典的背包了——BZOJ2431但是这题不能用背包来做考虑容斥。朴素的容斥要枚举哪些超过限制,这样复杂度是指数级别的,但是很多是有重复的令 fi,jf_{i,j} 表示用 ii 个数组成 jj 的方案数gi=∑fi,j×(n+k−j原创 2017-10-16 15:23:01 · 1052 阅读 · 0 评论 -
[容斥 状压DP] HDU4997. Biconnected
令 fSf_S 表示点集 SS 的答案,gSg_S 表示点集 SS 的连通图个数那么 gSg_S 可以通过枚举与编号最小的点联通的点集求出来fS=gS−∑T∈SgT×MT,S−Tf_S=g_S-\sum_{T\in S}g_T\times M_{T,S-T},MS,TM_{S,T} 表示把点集 SS 分成几个联通块后连到 TT 上的方案数#include <cstdio>#include <ios原创 2017-12-26 21:20:45 · 488 阅读 · 0 评论 -
[DP套DP 状压] HDU4899. Hero meet devil
学一发DP套DP#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=1<<16|5,P=1e9+7;int T,n,m;char a[20],b[5]={'A','T','C','G'};int f[2][N],g[N][5],w[原创 2017-12-27 14:10:42 · 581 阅读 · 0 评论 -
[矩阵乘法优化DP] Topcoder SRM554. TheBrickTowerHardDivOne
dpfi,sfi,sf_{i,s} 表示第 iii 层的状态为 sss 的方案数转移是一个矩乘的形式用矩乘快速幂优化#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int P=1234567891;typedef...原创 2018-03-07 18:58:39 · 438 阅读 · 0 评论 -
[DP 博弈] Topcoder SRM579 Div1. RockPaperScissors
每一轮的策略跟之前出现过的剪刀石头布的数量有关另 fi,a,b,cfi,a,b,cf_{i,a,b,c} 表示之前出现了 aaa 次石头, bbb 次剪刀 ,ccc 次布,然后第 iii 个筛子没用过的概率DP一下,每一轮独立算贡献// BEGIN CUT HERE // END CUT HERE #include <vector> #include <...原创 2018-02-28 11:12:04 · 366 阅读 · 0 评论 -
[DP] Codeforces 936D. World of Tank
令 fi,jfi,jf_{i,j} 表示走到 (i,j)(i,j)(i,j) 时的最大充能坐标离散后 O(n)O(n)O(n) DP一下就好了#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#define all(x) x.begin()...原创 2018-03-05 16:55:12 · 521 阅读 · 0 评论 -
[DP] 【UNR #2】积劳成疾
fi,jfi,jf_{i,j} 表示长度为 iii 最大值为 jjj 的序列的答案枚举最大值的位置转移就好了#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=410,P=998244353;int n,k,an...原创 2018-03-14 09:58:48 · 423 阅读 · 0 评论 -
[数位DP] 【UNR #2】梦中的题面
当 c=1c=1c=1 的时候,很容易想到转成 bbb 进制每一位独立考虑,就可以数位DP了 当 c=0c=0c=0 的时候,再加一维表示之前满足 xi=bixi=bix_i=b^i 的个数就可以了#include <cstdio>#include <iostream>#include <algorithm>#include <cst...原创 2018-03-14 10:04:26 · 690 阅读 · 0 评论 -
[DP] LOJ#6307. 「雅礼国庆 2017 Day1」Clique
假设 xi>xjxi>xjx_i>x_j那么 iii 和 jjj 之间有边的条件是 xi−xj≥wi+wjxi−xj≥wi+wjx_i-x_j\ge w_i+w_j把一个点看作一个区间 (xi−wi,xi+wi)(xi−wi,xi+wi)(x_i-w_i,x_i+w_i)那么两个点有边的条件就是两个点代表的区间不重叠这题就转化成选出最多从区间使得这些区间两两不重叠这...原创 2018-03-20 11:02:59 · 328 阅读 · 0 评论 -
[DP] Topcoder SRM 562 DIV1. InducedSubgraphs
分类讨论当 2k≤n2k≤n2k\le n 时,两边是树中间是一条链,枚举链然后DP当 2k>n2k>n2k>n 时,中间部分为一个联通块,这个联通块一定过重心,求出重心后DP#include <cstdio>#include <iostream>#include <algorithm>#include <vector>...原创 2018-03-24 13:51:31 · 475 阅读 · 0 评论 -
[DP] LOJ#2473. 「九省联考 2018」秘密袭击
设 fifif_i 表示选出的联通块第 kkk 大的值大于等于 iii 的方案数那么答案就是 ∑wi=1i(fi−fi+1)=∑wi=1fi∑i=1wi(fi−fi+1)=∑i=1wfi\sum_{i=1}^w i(f_i-f_{i+1})=\sum_{i=1}^w f_i枚举 iii,把权值大于等于 iii 的点标记为 111,否则标记为 000,那么 fifif_i 就是树上包含至少 ...原创 2018-04-07 21:36:23 · 673 阅读 · 0 评论 -
[DP] HDU5492. Find a path
推式子 ans=(n+m−1)∑i=1n+m−1Ai 2−(∑i=1n+m−1Ai)2" role="presentation">ans=(n+m−1)∑i=1n+m−1Ai 2−(∑i=1n+m−1Ai)2ans=(n+m−1)∑i=1n+m−1Ai 2−(∑i=1n+m−1Ai)2ans=(n+m-原创 2018-01-27 20:32:32 · 360 阅读 · 0 评论 -
[DP] LOJ#6172. Samjia 和大树
考虑暴力的dp fx,i" role="presentation">fx,ifx,if_{x,i} 表示 x" role="presentation">xxx 点权值为 i" role="presentation">iii 的方案数,这个dp数组是有对称性的。 再观察一下可以发现,大于 n∗k" role="presentation">n∗kn∗kn*k 且小于 m−原创 2018-01-26 19:59:49 · 424 阅读 · 0 评论 -
[DP 分块子集枚举] UOJ#300.【CTSC2017】吉夫特
DP转移很好写暴力是 O(318)O(3^{18}) 的把每个二进制数分成前9位和后9位,分块统计复杂度就是 O(69)O(6^9) 了#include #include #include using namespace std;const int N=333333,P=1e9+7;int n,ans,a[N],f[N];inline int Query(int x原创 2018-01-17 21:25:45 · 442 阅读 · 0 评论 -
[矩乘优化DP] Topcoder SRM550 DIV1 Hard. ConversionMachine
每个位置显然是先变成正确的,然后进去若干循环这样就可以算出最多进行多少轮变换,令 fi,j,kf_{i,j,k} 表示进行了 ii 轮变换,有 jj 个位置差一次变换, kk 个位置差两次变换直接DP肯定不行,可以用矩乘优化// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #include <map>原创 2018-01-03 11:20:24 · 594 阅读 · 0 评论 -
[容斥 & 状压DP & FFT] Tco 2016 Final. HamiltonianPaths
相当于是问有多少种排列,使得相邻的点之间没有边 考虑容斥 一张图中选了 dd 条边,那么会形成 n−dn-d 条链,设所有图中的链总共有 xx 条,那么答案乘上 x!x! 只要DP出形成 aa 条链的方案数,然后NTT一下就可以了// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #include原创 2018-01-03 18:37:11 · 391 阅读 · 0 评论 -
[DP] Topcoder SRM 552 DIV1 Hard. HolyNumbers
fi,jf_{i,j} 表示前 ii 个质数,能组成小于等于 jj 的方案数 转移简单,但是记忆化会爆内存 倒过来考虑, fi,jf_{i,j} 表示用了后 ii 个质数的方案数,那么当 p2i>jp_i^2>j 时就可以用二分查找解决// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #inclu原创 2018-01-04 09:07:02 · 494 阅读 · 0 评论 -
[容斥 DP] Topcoder SRM 498 DIV1 Hard. FoxJumping
容斥 令 fi,jf_{i,j} 表示走了 ii 步不合法的,x和y都走了 jj 的方案数 li,jl_{i,j},ri,jr_{i,j} 分别表示在x,y方向上随便走了 ii 步,走了 jj 的方案数那么答案是 ∑d=0R(−1)d(Rd)∑i=0nfd,i×lR−d,n−i×rR−d,m−i\sum_{d=0}^R(-1)^d{R\choose d}\sum_{i=0}^nf_{d,i}原创 2018-01-04 10:42:05 · 507 阅读 · 0 评论 -
[状压DP || 容斥 矩阵树定理] Codeforces 53E. Dead Ends
容斥练习题这题状压DP的做法跟今年NOIP那题状压一样简单——vectorxj也可以容斥 枚举叶子的集合 SS,算出非叶子的点的导出子图的生成树个数,再乘上每个叶子和这些点的边的数量 这样可以算出 fif_i,至少有 ii 个叶子的方案数然后就跟一般容斥一样 gi=fi−∑j=i+1n(ji)gjg_i=f_i-\sum_{j=i+1}^n{j\choose i}g_j#include <原创 2018-01-04 11:52:50 · 542 阅读 · 0 评论 -
[容斥DP & 高精度] BZOJ2024 [SHOI2009] 舞会
男女生按升高排序 令 fi,jf_{i,j} 表示前 ii 个女生中有 jj 个比男生高(其他 i−ji-j 个不确定)的方案数DP出来了容斥一下就可以了#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=210;const int原创 2018-01-04 14:19:07 · 423 阅读 · 0 评论 -
[补集转换 DP] Topcoder SRM 509 DIV1 Hard. NumberLabyrinthDiv1
令 fi,j,kf_{i,j,k} 表示第 ii 个点通过加了 kk 个点到 jj 的方案数 gi,j,kg_{i,j,k} 表示第 ii 个点通过加了 kk 个点到 jj 且不经过其他点的方案数gi,j,kg_{i,j,k} 可以通过补集转换计算出 然后DP就很简单了// BEGIN CUT HERE // END CUT HERE #include <vector> #includ原创 2018-01-04 16:02:40 · 482 阅读 · 0 评论