
动态规划
ws_yzy
一如OI情似海
展开
-
4521: [Cqoi2016]手机号码|数位DP
数据范围这么小..感觉暴力可过啊.. DP也是随便设计状态 F[i][j][k][s][l]F[i][j][k][s][l] 表示前ii位,最后一位是jj 最后一位连续出现kk次(如果k已经等于3那么就一直不变)ss表示4,84,8的出现状态 ll表示前缀是否和原数的前缀相同 转移就是枚举下一位转移,也很简单..#include<algorithm>#include<iostream>#i原创 2016-04-24 16:36:32 · 3627 阅读 · 0 评论 -
3357: [Usaco2004]等差数列|DP
map水题大法好#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<vector>#include<cstdio>#include<queue>#include<cmath>#include<set>#include<map>#define inf 1e60#define原创 2016-03-17 16:31:28 · 665 阅读 · 0 评论 -
BZOJ 4282: 慎二的随机数列|动态规划
显然随机的数全部属于上升序列肯定能构造出最优解,那么直接认为随机的数都在最优解中。 如果是求最长不上升子序列的话就直接去掉所有的随机数求一遍然后加上随机数的个数。 现在是让求最长上升子序列,只需把每个数都减去前面随机的数的个数然后求一遍再加上随机数的个数即为答案!#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath原创 2016-02-04 07:57:44 · 692 阅读 · 0 评论 -
BZOJ 1133: [POI2009]Kon|动态规划
完了完了,这种傻逼动态规划也不会做了……药丸药丸 题意中描述的查票是在i到i+1之间 用f[i][j]查了j次票,最后一次查的是i到i+1的最多人数 暴力枚举前面的转移就可以#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<vector>#include<queue>#include<原创 2016-02-03 16:54:00 · 574 阅读 · 0 评论 -
BZOJ 4321: queue2|动态规划
状态比较难设计 f[i][j][0..1]表示1..i沙茶排完队,j对不满足条件的人,i和i-1是否靠在一起的方案数#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<vector>#include<queue>#include<iostream>#include<algorithm>#原创 2016-02-03 15:05:42 · 936 阅读 · 0 评论 -
BZOJ 2442: [Usaco2011 Open]修剪草坪|动态规划
这个题需要反过来想f[i] 表示不选i的最小损耗然后用个单调队列维护一下#include#include#include#include#include#include#include#include#include#include#define T 110005using namespace std;int sc(){ int i=0; char c=ge原创 2016-01-15 14:55:37 · 911 阅读 · 0 评论 -
BZOJ 1537: [POI2005]Aut- The Bus|动态规划|树状数组
如果坐标范围小一点就是最普通dp范围大了 离散化一下再加上树状数组维护一个前缀的最大值#include#include#include#include#include#include#include#include#include#include#define lowbit(x) (x&(-x))#define T 110005using namespace s原创 2016-01-15 10:50:47 · 723 阅读 · 0 评论 -
BZOJ 1233: [Usaco2009Open]干草堆tower|动态规划
从上往下枚举让当前的一层保持最瘦真是一道神题,然而并不会做#include#include#include#include#include#include#include#include#include#include#define T 110005using namespace std;int sc(){ int i=0; char c=getchar()原创 2016-01-15 09:18:25 · 828 阅读 · 0 评论 -
BZOJ 1093: [ZJOI2007]最大半连通子图|tarjan|动态规划
题意中两个半子图不同是指有点不同好奇怪的一句话啊就是子图中包含的点不同,不管边怎样然后就是tarjan dp注意不要连重边窝用的是map判重#include#include#include#include#include#include#include#include#include#include#define T 100100using names原创 2016-01-14 19:08:05 · 857 阅读 · 3 评论 -
4275: [ONTAK2015]Badania naukowe|DP
可以考虑分别从A串和B串中都取出一段序列,取出的这段序列满足存在子序列C 然后对剩余的序列分别求最长公共子序列。 Ps:Ps:卡常大法好!第一次卡到rank1rank1~ 但是代码又长又丑#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#in原创 2016-03-06 18:39:45 · 562 阅读 · 0 评论 -
4416: [Shoi2013]阶乘字符串|状压DP
f[S]f[S]表示当前的集合为SS时满足阶乘字符串时的最后一个字母的位置。 g[i][j]g[i][j]表示以i+1i+1开始的第一个jj字母出现的位置。 然后枚举子集转移,最后判断一下是否满足f[(1<<n)−1]≤mf[(1<<n)−1]≤m 然后如果n>21n>21那么直接判去#include<bits/stdc++.h>using namespace std;int f[2222原创 2016-03-09 08:40:51 · 1062 阅读 · 0 评论 -
BZOJ 1879: [Sdoi2009]Bill的挑战|状压DP
看完题解感觉思路很正常,为什么自己想不出来捏.. F[i][j]F[i][j]表示ii个字符都匹配好了时状态为jj(状压表示)的方案数#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<set> #include<map> #inclu原创 2016-02-25 19:28:54 · 892 阅读 · 0 评论 -
4455: [Zjoi2016]小星星|状压DP|容斥原理
OrzSDOIR1ak的晨神 可以考虑状压DP枚举子集,求出只保证连通性不保证一一对应的状态下的方案数,然后容斥一下就是最终的答案#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<q原创 2016-04-18 15:08:49 · 1542 阅读 · 1 评论 -
2164: 采矿|树链剖分|DP
DP比较显然,但是直接DP会Tle,这时需要树链剖分用线段树维护dp值同时维护链上的和子树的dp值#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<原创 2016-04-18 14:58:55 · 818 阅读 · 1 评论 -
4518: [Sdoi2016]征途|斜率优化
裸的斜率优化。。我考场上SB#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#include<set原创 2016-04-15 08:33:59 · 1682 阅读 · 0 评论 -
4417: [Shoi2013]超级跳马|DP+矩阵快速幂
DP比较显然,用到矩阵乘法快速幂需要一点转换。 F1[i][j]F_{1}[i][j]表示从起点走到第(2∗i−1)(2*i-1)列,第jj行的方案数 F2[i][j]F_{2}[i][j]表示从起点走到第(2∗i)(2*i)列,第jj行的方案数 转移就是: F1[i][j]=∑k<iF2[k][j−1]+F2[k][j]+F2[k][j+1]F_{1}[i][j]=\sum_{k<i}F_原创 2016-03-15 10:37:31 · 1004 阅读 · 0 评论 -
POJ3017Cut the Sequence|DP|单调队列|set
题目大意:给定一个有n个非负整数的数列a,要求将其划分为若干个部分,使得每部分的和不超过给定的常数m,并且所有部分的最大值的和最小。 维护一个a数组的单调下降序列,求答案的时候可以暴力,set会快一点#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include原创 2016-02-29 15:41:56 · 503 阅读 · 0 评论 -
3156: 防御准备|DP|斜率优化
显然看完题目就知道是DP了 F[i]F[i]表示从ii个检查点到最后全都合法的最小花费 G[i]G[i]表示在第ii个检查点放置守卫塔的情况下从ii个检查点到最后全都合法的最小花费 G[i]=a[i]+F[i+1]G[i]=a[i]+F[i+1] F[i]=min((j−i)∗(1+j−i)2+G[j]),j≥iF[i]=min\big(\frac{(j-i)*(1+j-i)}{2}+G[j原创 2016-02-29 10:32:01 · 410 阅读 · 0 评论 -
BZOJ 2111: [ZJOI2010]Perm 排列计数|组合数学|Lucas定理|DP
题目也就是让求1..n1..n的小根堆的数目 F[i]F[i]表示以标号为i的点做堆顶的合法堆的数目 f[i]=C(size[i]−1,size[i<<1])∗f[i<<1]∗f[i<<1|1]f[i]=C(size[i]-1,size[i<<1])*f[i<<1]*f[i<<1|1] 组合数要用Lucas定理求!#include<bits/stdc++.h>using namespace原创 2016-02-28 10:18:06 · 579 阅读 · 0 评论 -
BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛|动态规划|排列组合
DP就是一个傻逼题..f[i]f[i]表示有ii头牛的方案数 然后这道题是我从黄学长的排列组合的分类里找的..数学太渣.. 排列组合的做法,枚举牡牛的数量假设有ii头,每两头牛之间至少有kk头另一种牛将其隔开,就提前抽出这些用来隔开的牛然后组合计数#include<bits/stdc++.h>using namespace std;const int R=5000011;int f[100原创 2016-02-27 18:51:53 · 1105 阅读 · 3 评论 -
BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛|动态规划
刷水又来了一发裸的最长上升子序列然而我并没有写二分而是写的暴力#include#include#include#include#include#include#include#include#include#include#define T 5050using namespace std;int sc(){ int i=0;char c=getchar(原创 2016-01-13 20:47:07 · 1104 阅读 · 0 评论 -
BZOJ 1270: [BeijingWc2008]雷涛的小猫|动态规划
一开始思维定势了想上从左向右转移发现如果猫不听话乱蹦的话不太好处理那么就从上往下转移对于乱蹦的情况记录一个高度上的最大值mxhf[i][j](表示在坐标(i,j)处能吃到的最多的柿子)f[i][j]=max(f[i][j+1],mxh[j+delta]) #include#include#include#include#include#include#inc原创 2016-01-13 20:29:00 · 646 阅读 · 0 评论 -
BZOJ 1600: [Usaco2008 Oct]建造栅栏|动态规划
考虑一下构成四边形的条件任意一条边都dp f[i][j]表示选了i条边长度为j的方案数#include#include#include#include#include#include#include#include#include#includeusing namespace std;int f[5][2555],n,mx;int main(){ cin>>原创 2016-01-13 19:25:11 · 682 阅读 · 0 评论 -
1492: [NOI2007]货币兑换Cash|动态规划|cdq分治
好厉害的分治贴代码可以参考论文#include#include#include#include#include#include#include#include#include#include#define T 120000#define eps 1e-9#define inf 1e9using namespace std;struct W{ double原创 2016-01-18 20:47:19 · 634 阅读 · 0 评论 -
1076: [SCOI2008]奖励关|状压动规|概率与期望
状压一下#include#include#include#include#include#include#include#include#include#includeusing namespace std;double f[101][66666];int v[22],p[22];int K,n;int main(){ scanf("%d%d",&K,&n); f原创 2016-01-17 09:38:38 · 431 阅读 · 0 评论 -
BZOJ 2064: 分裂|状压动规
传说中只可意会不可言传的dp#include#include#include#include#include#include#include#include#include#include#define T 2222222using namespace std;int sum[T],f[T],n,m,K;int main(){ scanf("%d",&n); f原创 2016-01-16 10:10:47 · 651 阅读 · 0 评论 -
[Apio2015]巴厘岛的雕塑|动态规划
一定要坚信 进制类的题一定是按位贪心!!!!!!!!!!!!然后就这些了0.0#include#include#include#include#include#include#include#include#include#include#define T 2002#define ll long longusing namespace std;long lon原创 2016-01-15 21:22:32 · 700 阅读 · 0 评论 -
BZOJ2302: [HAOI2011]Problem c|动态规划|组合数学
可以发现若编号否则就有解F[i][j]表示编号s[i]表示编号必须为i的人的个数sum[i]表示编号可以为C[i][j]表示从i个人中选j个人的方案数突然发现 C[i][j]符合杨辉三角 如此卧槽.....给自己智商跪了#include#define ll long longusing namespace std;int n,m,P;int s[333],s原创 2015-08-28 09:19:47 · 1075 阅读 · 0 评论 -
BZOJ2734: [HNOI2012]集合选数|状压DP
这题状压DP比较神奇对于n以内任意和6互质的数x可以构造一个矩阵x 3x 9x 27x....2x 6x 18x 54x...4x 12x 36x 108x.........然后发现相邻的数不能一起选只要枚举一下所有的x就ok了卧槽这不是经典的状压dp然后就sohehe了#include#define M 1000000001usin原创 2015-08-27 21:19:59 · 614 阅读 · 0 评论 -
BZOJ1806: [Ioi2007]Miners 矿工配餐
1806: [Ioi2007]Miners 矿工配餐Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 430 Solved: 281[Submit][Status][Discuss]Description现有两个煤矿,每个煤矿都雇用一组矿工。采煤工作很辛苦,所以矿工们需要良好饮食。每当一辆食品车到达煤矿时,矿工们便会产出一定数量原创 2015-08-27 11:21:09 · 540 阅读 · 0 评论 -
BZOJ 1090: [SCOI2003]字符串折叠|动态规划
F[i][j]表示区间i到j的最短折叠 转移时枚举区间中的点即可#include<set>#include<map>#include<ctime>#include<queue>#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<cstdlib>#include<iostream>#in原创 2016-01-19 07:33:03 · 752 阅读 · 0 评论 -
BZOJ 4006: [JLOI2015]管道连接|斯坦纳树
斯坦纳树似乎是带有关键点的最小生成树 暴力状压,然后还有染色,似乎要再套一个状压#include<set>#include<map>#include<ctime>#include<queue>#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<cstdlib>#include<iostr原创 2016-01-19 14:21:50 · 910 阅读 · 0 评论 -
BZOJ 3233: [Ahoi2013]找硬币|动态规划
F[i]表示最大的钢镚为i时需要的最少数量 F[i]显然要由i的因子j,F[j]转移过来 转移方程: F[i]=min(F[j]−∑⌊a[k]/i⌋∗(i/j−1) 这样复杂度还有点高会T 有一个优化就是枚举j的时候有一些是可以忽略的 只需要枚举i/p(p为i的质因子) 否则肯定不是最优的随便画画就知道为什么了#include<set>#include<map>#include<cti原创 2016-01-19 19:49:47 · 894 阅读 · 0 评论 -
BZOJ 1044: [HAOI2008]木棍分割|动态规划|二分答案
先二分答案求出第一问第二问dpf[i][j]表示前j个分成i块的方案数f[i][j]=sigmaf[i-1][k](sum[j]-sum[k]sum是单调的滚动数组加维护一个前缀和复杂度(n*m)#include#include#include#include#include#include#include#include#include#include原创 2016-01-13 16:44:44 · 1176 阅读 · 0 评论 -
BZOJ 1025: [SCOI2009]游戏|动态规划
这个题需要转化一下原题中的转化必须要构成一些环要求的就是环的大小的最小公倍数的个数满足环的大小的和令F[i][j]表示前i个质数 和为j的方案数然后就相当于背包问题了 令prime[i]^k(k=1,2,3......)做物品 往里装#include#include#include#include#include#include#include#include原创 2016-01-13 15:12:41 · 395 阅读 · 0 评论 -
BZOJ 1264: [AHOI2006]基因匹配Match|动态规划
朴素的动规是n方的数据范围有点大考虑一下转移的时候 a[i]==b[j]开个数组把这与相等的5个数的位置存下来然后用树状数组维护各max{前缀}就ok了话说为什么最近总是犯一些傻逼的错误………………#include#include#include#include#include#include#include#include#include#incl原创 2016-01-13 11:15:34 · 1152 阅读 · 0 评论 -
BZOJ 1055: [HAOI2008]玩具取名|动态规划
这题我已开始sb了相邻的两个字母合并我想到只有2^i才可能有解了回归正题让f[i][j][k]表示i到j能否合并出k来k=0,1,2,3分别对应W,I,N,G然后暴力转移就好了#include#include#include#include#include#include#include#include#include#includeusing namesp原创 2016-01-13 09:32:20 · 666 阅读 · 0 评论 -
BZOJ 4247: 挂饰|动态规划
01背包DP傻逼题wa了10多发 真是日猴了#include#include#include#include#include#include#include#include#include#includeusing namespace std;int a[2002],b[2002],n;long long f[4002],ans=0;int cal(int x原创 2016-01-13 06:16:22 · 784 阅读 · 5 评论 -
BZOJ 2423: [HAOI2010]最长公共子序列|动态规划
第一问直接dp求if s1[i]==s2[j] then f[i][j]=f[i-1][j-1]+1else f[i][j]=max(f[i][j-1],f[i-1][j])用g[i][j]来表示方案数。对于A[i]==B[i]g[i][j]=g[i-1][j-1]+k1*g[i-1][j]+k2*g[i][j-1]f[i][j]=f[i-1][j] then k1=1 e原创 2016-01-06 15:26:05 · 1803 阅读 · 2 评论 -
BZOJ1996: [Hnoi2010]chorus 合唱队|动态规划
一道很好的DP题因为无后效性,选完一个区间后,对选下一个的影响就是最后放的那一个在左边还是后右边,所以开个三维数组存一下然后直接转移就好了。f[i][j][0/1]表示取到数列中从i到j的区间,上一个取到的是数列左边/右边的数f[i][j][0]=f[i+1][j][0]*(a[i]f[i][j][1]=f[i][j+1][0]+(a[j]>a[i])+f[i][j原创 2016-01-05 19:31:13 · 939 阅读 · 1 评论