dp
Pro_space
从蒟蒻开始成长~
展开
-
【DP】poj1636
#include#include#include#include#include#includeusing namespace std;int link[1100],n,tmp_1,tmp_2,tail,m,tot,f[510][4];bool flag[410][310],flag_point[1100];struct rec{int num,next;}e[100100原创 2015-05-13 12:10:03 · 458 阅读 · 0 评论 -
【DP】poj1947
题目大意:给出一棵树,让你隔断一些边,使得割完后剩下的联通块里有某个联通块刚好包含k个节点,然后隔断的边尽量少也是一道典型的树形dp然后很明显能看出要以每个节点i及其子树中保留j个节点最少割多少次来作为状态这个题大概难点在初始化吧。。想了好久。。。我当时的初始化是f[i][1]=vec[i].size()-1,也就是i节点的总儿子数然后转移分两种一种是选了某个儿子那就是no原创 2015-08-14 13:26:33 · 421 阅读 · 0 评论 -
【DP】hdu2476
现场做的时候挺模糊的一个dp,借鉴了JustSteps的题解就是用dp[i][j]表示按照i,j完全不同来处理最少用多少步然后最后ans再来处理中间有不用刷的情况代码也是基本按照JustSteps的写法。。。#include#include#include#include#include#includeusing namespace std;int dp[110][110原创 2015-07-23 20:37:27 · 466 阅读 · 0 评论 -
【DP】hdu4111
题意:有N堆石子,每堆石子有一个数目,现有两个人博弈,每个人每次可以进行两个操作中的一个:1、从某堆拿掉一个石子(若某堆石子为0了,那么这堆就不存在了);2、合并两堆石子没有操作的就输。问是哪个赢难点:1.想到如果多个堆多于1那么胜利的一方一定会想尽办法合并,又因为每堆都多余1所以无法阻止合并 2.如果有一就单独考虑所以解法就是用f[i][原创 2015-09-24 12:33:34 · 516 阅读 · 0 评论 -
【DP】Codeforces Round #336 (Div. 2) C
我只是觉得人云亦云的写二分不好,这个题看了看数据范围,果然最快的方法还是暴力枚举吧。#include#include#include#include#include#includeint n;int f[1001000],next[1001000];bool flag[1001000];using namespace std;int main(){ freopen("tes原创 2015-12-30 18:25:56 · 286 阅读 · 0 评论 -
【DP】good bye 2015 D
当时忽略了相等如果重复的话暴力判的话效率是n^3的,然后发现只要预处理一下lcp就好了。想问题还是会忽略细节啊。#include#include#include#include#include#includeusing namespace std;int f[5002][5002];int n;int lcp[5002][5002];char s[100100];int ma原创 2016-01-01 20:10:35 · 328 阅读 · 0 评论 -
【DP】hdu3507
提议就是给出一个非负的序列,然后割成几段,每段的代价是那个公式。然后dp式很好推也能一眼看出是斜率优化。(d[i]-d[j]+sum[i]^2-sum[j]^2)/2(sum[i]-sum[j])j被玮神喷基本功不好了,于是打算多写几个斜率优化练一下,然后1,起始项是q[1]=0不是q[1]=1;2.传参的时候一定要对应,不要传值当做标号用3.一定要注意队头出队时候原创 2015-12-02 10:31:35 · 384 阅读 · 0 评论 -
【DP】poj1037
有点麻烦的一个DP一开始已经想到只跟顺序有关系,但是忘记了只要维护一个上升一个下降就可以解决转移的问题了然后还有一个点就是其实把任意一个数拿出去的话剩下序列跟拿出的数的关系是能推导出的。#include#include#include#include#include#includeusing namespace std;long long f[31][31][3];bool原创 2015-12-04 23:39:49 · 520 阅读 · 0 评论 -
【DP】AIM Tech Round (Div. 2) D
让你删一个连续区间,然后剩下的数可以加一减一,然后让他们的最大公约数不为0,很显然最大公约数一定是a1-1,a1+1,a1,an+1,an-1,an这六个数的质因子,所以就枚举这六个数的质因子来dp,很明显最后的结果是三个区间,那么dp也设立三个状态 f[i][0]代表在第一段里,f[i][1]代表在中间删除的那段里,f[i][2]代表在第二段没有删除的区间里#include#inclu原创 2016-02-16 11:56:03 · 477 阅读 · 0 评论 -
【DP】Codeforces Round #341 (Div. 2) E
问你用1-9拼一个mod x余k的数有多少种方法,一开始脑抽了,从低位到高位做了(虽然这样做后发现是有循环规律的),但是发现异常难做,然后看了下题解原来是从高位往低位做了之后然后每次相当于余数乘十再加上1-9,所以构建余数矩阵f[i][(10*i)+x] += sum[x] 然后f矩阵做快速幂好了。。。#include#include#include#include#inc原创 2016-02-02 22:18:14 · 404 阅读 · 0 评论 -
【DP】scu4441
枚举10000所在位置然后,先预处理出来10000右边的情况,然后再处理左边,算法很好像,但是细节很繁琐,因为数组开小了wa了很多炮。。。#include#include#include#include#include#include#includeusing namespace std;int n,tail,ans;int c[20100],a[200100],dp[20010原创 2016-02-21 03:38:25 · 650 阅读 · 0 评论 -
【DP】poj1722
每次取出两个数相减,其实就是给整个数列标加减号,想明白这一点这个题就好做了,一眼看上去很像一个区间DP啊,然后第二个数一定是只能减的。。#include#include#include#include#include#includeusing namespace std;int T,n,a[101000],f[110][20100],biao[110];int main(){原创 2016-04-02 19:18:21 · 501 阅读 · 0 评论 -
[dp+图论] poj1112
#include#include#include#include#includeusing namespace std;int f[110][110];int sum[110][3];int dp[105][105][105];int de[105][105][105];int col[110][3];int ans0[120],ans1[120];int n;bool原创 2016-05-12 20:22:22 · 546 阅读 · 0 评论 -
【DP】poj2486
多校训练的树形dp就没有做出来过,所以最近也是网上把树形dp的题扒出来做一遍。其实跟普通的dp一样,树形dp也是需要找状态,确定状态转移方程,只不过状态转移的过程比较明确,就是从父亲向儿子转移或者儿子向父亲转移,只不过怎么转移通常是很难的问题。。。这个题的难点在于走向某一个节点之后还可能回来,然而也因此,状态就非常明显了,明显要分两类,一类是经过当前节点后回到当前节点,另一种是经过当前节点原创 2015-08-12 21:14:43 · 397 阅读 · 0 评论 -
【DP】poj1692
题意:对两个数列找一些匹配满足对于任意一个匹配有且仅有一个与其数字不同的匹配与之交叉。一开始觉得应该是个n^4的,结果想一想发现每次更新的时候,如果a[i]!=b[j]那每次在b里找最近的一个数等于a[i]然后在a里找最近的一个等于b[j]就好,也算是一种贪心的思想,想想,如果再往前找的话肯定不如最近的优于是就是n^3了#include#include#include#include#原创 2015-08-10 13:00:36 · 562 阅读 · 0 评论 -
【DP】poj1671
题意....挺简单的就自己读吧。做法..更简单了.dp方程f[i][j]=f[i-1][j]*j+f[i-1][j-1];f[i][j]表示长度为i其中最大数为j#include#include#include#include#include#includeusing namespace std;double f[210][210];int n;int main(){原创 2015-05-14 15:49:25 · 599 阅读 · 0 评论 -
【DP】poj1155
这个题算法不难想,然而感觉这个复杂度的计算比较感人,我现在也不明白这个题是怎样过了nf[i][k]表示在i这个节点选取k个叶子的最大值。。。在枚举当前子节点选多少个。。。上代码#include#include#include#include#include#includeusing namespace std;int n,m,link[10010],f[3040][3040],s原创 2015-05-20 14:32:29 · 330 阅读 · 0 评论 -
【DP】poj2184
这个网上大多数都是用一种偏移的思想做的,然而这样的话dp要分两种来做,但是如果运用滚动数组的话,既能使空间得到优化,也可以使dp只需要正向做一次就可以。f[1][j]的状态用f[0][k]来转移,这样就不会出现多次填装的问题。然而需要注意一点的是,f[1]一开始要初始化成和f[0]一样的。。。。因为这个问题wa了很多炮。。。#include#include#include#inclu原创 2015-05-18 22:40:27 · 497 阅读 · 0 评论 -
【DP】poj1458
基础的lcs问题。。。至于lcs是什么。。。。百度好了啊。。话说应该有一篇报告是写了怎么推到(推导)lcs公式的所以就随便粘个代码吧#include#include#include#include#include#includeusing namespace std;int f[1010][1010],len1,len2,maxf;char s[3][2010];in原创 2015-05-22 11:44:30 · 313 阅读 · 0 评论 -
【DP】poj2250
经典的lcs问题,然而却是得到了很多启发,当时并没有想到如果s[i]==ss[j]就可以直接用dp[i-1][j-1]+1转移,仔细想了一下,dp[i][j-1]和dp[i-1][j]一定是递归输出也很巧妙,利用状态的转移,来判断输出路径。第一次sb了,用s[1],s[2]的时候变量定义成了char s[2][310][110]然而下表确乎是从零开始的orz。。。。#include#in原创 2015-05-19 09:33:25 · 519 阅读 · 0 评论 -
【DP】zoj3164
这个题是背包的一个大综合题,大概出了有依赖关系的背包以外蕴含了所有背包类型,然后这里归一下类几种背包问题的解法。01背包:暴力解法:f[i][j]代表考虑了前i个物品装了j的体积 转移就用f[i-1][j-v[i]]+w[i]; 优化空间:1,f[j]代表考虑了j的体积 转移f[j-v[i]]+w[i]],注意枚举体积时要倒序枚举,这样省空间的原理是f[j]原创 2015-05-19 22:53:33 · 350 阅读 · 0 评论 -
【DP】poj2923
这个是一道状压dp,先预处理出所有可以一次运输的状态,然后在转移就可以了。然而还是有一个地方要注意,两个符号是判断,一个符号是位运算orz....#include#include#include#include#include#includeusing namespace std;bool flag[10010];int q[4][10010],tail[4],c[4],dp[原创 2015-05-20 00:50:12 · 508 阅读 · 0 评论 -
【DP】sgu104
所谓的花瓶问题。。。经典dp问题。。然而我又是骚气的想出了一种骚气的dp方程dp[i][j]=max(dp[i-1][k]+f[i][j])//注意k要从i-1开始枚举!!!这样dp方程的好处就是有一种很骚气的输出写法,这个写法的灵感也是借鉴了Poj有个lcs的问题而想到的,上代码#include#include#include#include#include#inclu原创 2015-05-25 23:46:41 · 441 阅读 · 0 评论 -
【DP】uva1354
因为代码不是自己写的所以就算转载吧。大体思想是想出来的,就是二进制枚举,但是实现实在有点写不来。。。#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusin转载 2015-06-12 15:00:35 · 412 阅读 · 0 评论 -
【DP】CodeForces 148D
大概思路如下,一种是妹子直接赢另一种是龙不赢接着拿。。对于f[i][j]表示剩i个白鼠j个黑鼠妹子直接赢就是i/(i+j)龙不赢就是妹子输的几率再乘上递归的条件。还有一些细节具体如下#include#include#include#include#include#includeusing namespace std;double f[1050][105原创 2015-06-12 17:17:29 · 452 阅读 · 0 评论 -
【DP】coderforces 567F
正式开始刷cf的题。。。cf的题真是厉害,随便找一道都这么变态,真的是做过最麻烦的DP了。。。状态很好想f[i][j][k]表示从前往后填了i个从后往前填了j个最大数为k的概率。然后就是暴力枚举每一个限制条件然后看能否转移。就是暴力的话需要分类分的很清楚。对于相等的情况,如果当前要转移状态一个被限制,而另一个没有限制,那么说明是不能转移的对于大于的情况,如果当前要转原创 2015-08-07 16:14:54 · 768 阅读 · 0 评论 -
【DP】poj1185
题意很简单,题目也很水唯一一个容易忽略的地方就是状态数其实没有看起来的那么多,因为有一个攻击范围的限制所以状态数其实很少。然后,脑残的又把数据范围开小了。。。。#include#include#include#include#include#include#define N (1<<9)+(1<<6)+(1<<3)+1+10int map[210],f[3][N][N];i原创 2015-07-14 20:52:37 · 345 阅读 · 0 评论 -
[dp+数论]bzoj1004
具体解法关键的就两句话每个置换的核染色方案数相加/置换数=总染色方案数每个置换的核染色方案数=缩环后的染色方案数#include#include#include#include#include#includeusing namespace std;int f[31][31][31];int cg[71];bool flag[71];int sum[7原创 2016-05-16 19:52:34 · 453 阅读 · 0 评论