DP
文章平均质量分 76
glq007
muyou
展开
-
2014-2015 ACM-ICPC, NEERC K Kebab House(dp)
题意:有n个时间块,每个pi时间块要煎至少xi次披萨,其余时间可以做梦,要求是每2次做梦间隔要大于等于(t+1),问合法情况总数。做法:我们可以发觉,每个块对于后面的块影响只有最后一个做梦的时间离最后的距离,所以我们用pre[i]表示最后一个做梦的时间离最后距离为i的情况总数。每个块可以单独算,令dp[i][j]为第i个位置做梦,且总做梦数为j次的情况总数,可以发觉dp[i][1]是由前一个块原创 2015-11-22 19:09:05 · 1048 阅读 · 0 评论 -
hdu 5208 Where is Bob(数位dp)
题意:Alice和Bob各有一个选择数的区间,2人各选一个异或是最后的值,Alice想让这个数大,Bob想让这个数小,2人都很聪明,Alice先选,问最后的数是多少?做法:可以知道如果要异或为1,那么必须一个为0,一个为1,因为Alice先选,所以若想那位为1,如果Alice这位选0,Bob的数必须这位都是1,才能使得这位为1。反之也一样,所以就从高位往低位走进行搜索,记得上下界是会随着选的数原创 2015-04-19 20:52:48 · 961 阅读 · 0 评论 -
CodeForces 28D Don't fear, DravDe is kind(dp)
题意:给你一些四元组(v,c,l,r),要你选出一些作为组合,不能改变相对顺序,要求是对于其中一个,l_i是之上所有c_i之和,r_i是之下所有c_i之和。要你选出的组合sum(v_i)最大。解法:因为对于一个组合来说,l_i是之上所有c_i之和,r_i是之下所有c_i之和,在加上当前的c_i,那么c_i+l_i+r_i是这个组合全部c_i之和,因此要成为一个组合,至少c_i+l_i+r_i之原创 2015-04-07 11:29:53 · 1085 阅读 · 0 评论 -
HDU 4114 Disney's FastPass(状压dp)
题意就是给你一些点,有的地方有景区,有的地方有某些景点的优先票,拿优先票去景点和不拿的时间不一样。问从地点1出发去所有景点再回来的最短时间。得把景点,景区进行状压。即dp[i][j][k]代表参观景点状态为i,景区状态为j,停在k的最短时间。先floyd一下处理出最短路。对于一种状态i,j,为了保证dp[i][j][k]在递推的时候是最短时间可以先用2个(1-n)for循环进行更新,因原创 2015-03-20 16:49:35 · 621 阅读 · 0 评论 -
HDU 5188 zhx and contest(有限制01背包)
题意就是给你一些事要做,有的事至少要在>=l的时间完成才行。做法讲起来很简单,按照l-t的大小进行排序,然后普通的01背包。为何?首先这题01背包是指做了先前的事再做当前这件事来递推最优。想一下,如果2件事的l-t(即最小可以开始做的时间)都在比较前面,那么我这两件事紧接着做,从第i时间开始,那么交换顺序也没有关系,反正都是在i+t1+t2完成,得到的价值也是v1+v2,但是什么情况下会出原创 2015-03-17 00:48:49 · 703 阅读 · 0 评论 -
UVA 473 Raucous Rockers(多个背包dp)
题意:n首歌,以及m个唱片,在唱片中要以发布顺序排,要求最多能放几首歌。一开始我的想法是刷表法,状态dp[i][j][k]代表放了前i个歌,用了j个唱片,还用了k个时间所拥有最多歌数。然后有2种转移。一种是k+ai dp[i-1][j][k+ai], dp[i-1][j][k]+1),反之就直接放在下一个背包里,dp[i][j+1][ai] = max(dp[i-1][j+1][ai]原创 2015-03-25 21:53:27 · 605 阅读 · 0 评论 -
HDU 2833 WuKong(floyd+dp)
题意:给你一张图,以及2对点,要求这2对点的最短路上最多能有多少点是共有的。在做floyd的时候加上一个数组num来代表从i到j最短路最多能有几个点。然后枚举i,j,如果i到j是起点a到终点b的最短路上的,那么dis[a][b] = dis[a][i]+dis[i][j]+dis[j][b],或者 dis[a][b] = dis[b][i]+dis[i][j]+dis[j][a]然后这原创 2015-03-25 14:34:33 · 491 阅读 · 0 评论 -
UVA 12099 The Bookcase(dp)
题意就是3个架子,一堆书,放入后,要求每层宽度最大值乘以总高度最小。(每层必须要放书)此题就属于提前规定一些方向简化状态的典型,比如把书的高度从高到低排序,这样的话,如果你要放的这层已经放书了,你要放的这本一定比这层放的矮,这样就不用纠结高度的问题了,dp[i][j][k]代表第二层宽度为j,第三层宽度为k的总高度。事实上这题完全可以用二维来做,为何?因为递推的方向都是单向的,比如第二层放书了原创 2015-03-02 18:44:16 · 1087 阅读 · 0 评论 -
UVA 1204 Fun Game(状压dp)
此题真心有难度,之前刷紫书dp题时就卡在这题,重新拿起总算基本想通,但是关于每个串都与下个串有重叠的解决办法没有看懂,最后去看了下LRJ的代码,原来根本不必额外特判什么的。只需要规定一个串为首串,在最后的时候把dp[(1然后其他的做法书上都说了,对于一个状态加一个串是正过来贴还是反过来贴去更新下个状态。然后我还犯了一个很隐蔽的错误,找了很久。。具体就是,在去除那些被包含的串的时候,如果2个原创 2015-02-28 13:29:57 · 1283 阅读 · 0 评论 -
SPOJ-ZUMA(区间DP)
题意就与祖玛游戏差不多,唯一的区别在于当个数大于等于K的时候你可以选择不消掉,可以与之后的同色一起消。一开始想了一个错误的状态转移,后来找到反例就不说了。首先可以预处理一下,把颜色相同的给放在一起,这点很容易想到是对最优解不产生影响的,然后对于一个状态d[i,j],初始值就是d[i,i]+d[i+1,j]。然后枚举i到j中间哪个颜色跟i是一样的,因为如果不一样没必要在一起,假设k是跟i颜色一样原创 2014-12-15 00:38:36 · 1353 阅读 · 0 评论 -
HDU 5136 Yue Fei's Battle(计数DP)
最近不少题A了就不想写博客接着看别的题了。。这是懒么。。不过花点力气A的还是写写吧。题意:直径为K的树问直径最大为n的树,有多少种,一节点最多只能有3条路就是说是一颗二叉树,每条分支都是等价的,也就是说如果翻转或旋转后一样,对称,都属于一种。分奇数和偶数,如果是偶数,假设前n/2个节点加其他点的情况数为tmp,那么答案就是tmp×(tmp-1)/2+tmp,因为上半部分和下半部分如果不一样原创 2014-12-12 00:33:16 · 1058 阅读 · 2 评论 -
FZU 2179 chriswho(数位DP)
题意中文。原创 2014-11-25 13:01:32 · 929 阅读 · 0 评论 -
UVA 12105 Bigger is Better(数位DP)
题意不说了。此题大白书上有2个思路,第一个思路很容易想到,写起来也不难,原创 2014-11-25 00:03:30 · 1331 阅读 · 0 评论 -
HDU 5125 magic balls(dp+线段树优化)
题意就是每个人有2个球a和b,然后每交换一次需要1个能量,总共有M个能量,求左边球的最长上升子序列。做的时候一直在想弄M个单调队列。。想了好久还是想不出。。事实上应该是建m个树状数组,分别代表用了能量为i,球大小为j的最大子序列的长度,在新加入一个人的时候,对于a和b分别去询问每一个能量为i的时候所能达到的最长上升子序列的长度。a就直接更新第i颗,b要更新第i+1颗。这里因为是求1-(原创 2014-11-30 02:03:09 · 1130 阅读 · 2 评论 -
CodeForces - 486D Valid Sets(树上的DP计数)
题意比较容易理解,就是树上yi原创 2014-11-20 00:46:22 · 1144 阅读 · 0 评论 -
CodeForces 534F Simplified Nonogram (记忆化搜索)
题意:给定n×m的格子块(最大5×20),以及每行每列的联通块个数,要你构造出一组满足条件的解,至少有一组解。做法:先把每列的不同联通块个数的状态给搜出来,这个利用dfs就可以解决,然后按照列从左到右去枚举状态,这列放上一个状态后要记得更新每行的联通块个数。dfs即可。但是这样肯定会超时的,需要减少重复搜索的东西,到第i列,5行状态为a,b,c,d,e且前一列的状态为x的时候,如果搜到底发原创 2015-04-14 15:58:54 · 1259 阅读 · 0 评论 -
CodeForces 31E TV Game(dp)
题意:给定n(1 解法:这个数字是选给M还是选给H,很明显的多阶段决策,用dp[i][j]代表已经选择了前i个数字,j个给了M串所能组成最大的和。转移的话就是dp[i+1][j] = dp[i][j]+(s[i+1]-‘0’)*x[n-i],x[i]代表10^i,或者转移到dp[i+1][j+1],方程也是一样的。第一个是把这个数字加到H串中,第二个是加到M串中,另外,因为要输出选择方案,所以原创 2015-04-09 14:39:10 · 814 阅读 · 0 评论 -
WHU 1568 Product(数位dp)
题意:给出一个数字,要求每位乘起来等于原数字的数字个数,每位的数字只能是2-9。做法:可以发现2-9数字中素数只有2 3 5 7,而5和7是不能进行拆分和合并的,所以我们只需要考虑2和3,用dp[i][j][k]代表2的个数为i个,3的个数为j个,组成数字有k位的数字个数。递推式也很简单,枚举最后一位为2,3,4,6,8,9转移即可。再算出这个后,枚举2和3组成的数字长度k,我们考虑放x个原创 2015-04-21 00:05:34 · 555 阅读 · 0 评论 -
hdu 5456 Matches Puzzle Game(dp)
题意:给出n个火柴,要求拼出形如x-y=z的等式,x,y,z都为正数。问情况总数。做法:用一个数组a[i]代表用了i根火柴拼成数字情况总数,数组b[i]代表用了i根火柴拼成2个数字(相差1)的情况总数。然后dp[i][0]代表用了i根火柴不借位的情况数,dp[i][1]则代表借位,然后枚举前面放的新的数字是几然后分类讨论即可。做法比较搓,细节问题多思考量比较大。AC代码:#pr原创 2015-09-20 23:48:26 · 1251 阅读 · 0 评论 -
hdu 5330 Route Statistics(状压dp)
题意:给出n个长度做法:挺难想的一个状压dp。只要把跟每个串的距离为x的有多少个算出来就可以求出最后的答案了。考虑一下子问题,我们只考虑与后几位的距离为x的有多少个,但是这样没法递推,因为前面的不知道,所以我们可以把前面的补全,故就有了dp[s1][s2][k]代表一些串的前缀就是s1,与s1+s2这个串的距离差为k的个数。我们可以发觉|s1|+|s2| = m,所以我们可以把前2维变成1维。原创 2015-10-08 13:19:47 · 1842 阅读 · 0 评论 -
hdu 4784 Dinner Coming Soon(dp)
做法:由于时间不可逆,所以无后效性,直接4维状态,时间,第几个宇宙,第几维,有多少物品,的最大钱数。转移很显然。AC代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#include#include#include#include原创 2015-09-17 22:42:55 · 597 阅读 · 0 评论 -
UVA 12929 - Aerial Tramway(dp)
题意:给出一些点(x,y)保证x递增,且相邻的y不相等。2个点相连的条件是有相等的y,且2点间别的点的y值都严格小于这2个点的y。给你m条边连,每个点之上连边的条数不超过k,求连边的长度最大值。做法:省赛第一题。当时陷入了k的深坑中并没有看这题。。。我们首先发觉每个可以连的区间都是不相交的,只有相邻和包含关系,所以是o(n)个(其实最多只有n/2个)。然后这段区间跟相邻的是没有关系的。跟这原创 2015-09-03 23:04:26 · 643 阅读 · 0 评论 -
CodeForces 573D Bear and Cavalry(线段树优化dp)
题意:给出n个战士和他们各自的n批马,我们可以把马换给别的战士,但是都得换(即战士不能拥有原来的马),我们要每个战士乘以给他换的那个马的和最大。q次询问,每次把2个战士的马交换,输出和最大的答案。做法:把战士根据值排序,我们可以证明每个战士一定不会给他分配排名与他相差超过2的马(可以枚举证明)。首先根据贪心我们可以发觉大的战士分配大的马一定是最好的,但是可能那个战士的排名与马的排名一样导致不能原创 2015-09-03 21:41:09 · 1394 阅读 · 0 评论 -
hdu 3693 Math teacher's homework(数位dp)
题意:给出n个数,每个数字代表0到这个数字的范围,每个里面要选一个,求异或和为K的情况总数。做法:挺难想的一个dp,我们把这些数换成2进制组成一个表格,首先可以明确一点,只要有一位可以随便放的二进制数的位(因为前面有的位已经使得比原数小了)不随便放,那么其他数这个位的0或1随便放,都可以达到想要的答案。而每一个位只需要一个这样的位就可以达到效果了,所以我们就规定第一个能随便放的地方不随便放,这原创 2015-08-12 01:36:32 · 1567 阅读 · 0 评论 -
CodeForces 571B Minimization(dp)
题意:给n,k,以及一个长度为n的序列,你可以打乱他们使得最小。做法:首先肯定按照大小顺序来排,连续的一段在一起肯定是更优的,我们可以发觉总共有k个互相之间无关的序列,我们需要把这个排完序后的序列划分成k个,k个中长度有的为x+1,有的为x,前者的个数为n-(n-1)/k*k,后者的个数为k-前者的个数。长度x为(n-1)/k。我们用dp[i][j]代表长度为x+1的已经分了i个,长度为x原创 2015-08-26 00:23:24 · 1121 阅读 · 0 评论 -
HOJ 13415 Website Tour(强连通缩点+多重背包dp)
题意:每个网站有个广告,看这个广告要花t的时间,能得p的分,最多只能看s次,然后给一些网站以及它所能到达的网站,从一个网站到另一个是不花时间的,但是不能停在同一个网站连续不停的看。现在有T的时间,起点任意,问最大得分。做法:由于都是有向边,所以我们可以把强连通分量缩点了,这其中的点都可以互相到达,再把这些缩后的点给拓扑排序,就是个DAG了,我们就可以dp了,在这个连通分量的点里面就是多重背包了原创 2015-08-24 19:44:23 · 579 阅读 · 0 评论 -
CodeForces 538E Demiurges Play Again(博弈dp)
题意:给出一棵树,叶节点都有编号,从根节点开始,一人走一步,第一个人想要得到的叶节点最大,第二个人想最小,问怎么安排,使得第一个人得到的叶节点最大,最小。做法:先考虑得到叶节点最大的情况。我们设dp[i]是当前人以他的走法能得到符合他的第dp[i]大数。那么假设对于第一个人,假设他的下一步第二个人可以得到第2大,第3大,第4大(3个分叉),那第一个最大可以得到下面所有数的第2大。我们可以安排最原创 2015-06-01 00:55:57 · 1293 阅读 · 0 评论 -
CodeForces - 49E Common ancestor(dp)
题意:有n个替换规则,2个字母可以被替换成一个字母,给出2个串,问这2个串经过一系列的替换后形成的最短且相同的串长度是多少。做法:我们可以先用区间dp,d[i][j][k]代表i到j区间是否可以变成k这个字母。再利用vector去存一下起点为i,变成k这个字母的终点为哪些,然后就可以进行后来的dp了。设dp[i][j]为第一个串用了i个字母,第二个串用了j个字母经过替换变成相同的串的最短长度。原创 2015-05-28 12:38:00 · 623 阅读 · 0 评论 -
zoj 3662 Math Magic(背包)
题意:k个数,和为n,lcm为m,求情况总数。用dp[i][j][k]表示放了i个数,和为j,lcm为k的情况总数,但是太大,所以要预处理出m的所有约数,以及lcm,还有映射关系。这样k就缩减到20左右。内存就开的下了。测了下1000 1000 100是差不多10^7次计算。AC代码:#pragma comment(linker, "/STACK:102400000,1024000原创 2015-05-20 17:09:56 · 701 阅读 · 0 评论 -
hdu 3507 Print Article(斜率优化dp)
题意:把一堆数分成几堆,每堆的代价由这个式子:,算出。求总代价最小。做法:另dp[i]是分到第i个总代价最小,那么转移方程,dp[i] = dp[j]+(sum[i]-sum[j])^2+M。可以发现递推复杂度是o(n^2)。我们变形一下这个式子:dp[i]-M-sum[i]^2 = dp[j]+sum[j]^2-2sum[i]*sum[j],等式左边都是不变量,即要求等式右边的最小值对应原创 2015-05-15 14:35:37 · 518 阅读 · 0 评论 -
BZOJ 1010 [HNOI2008]玩具装箱toy(斜率优化dp)
题意中文。做法:也是斜率优化的基础题。就是化简的时候注意不要写错了。AC代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#include#include#include#include#include#include#i原创 2015-05-15 14:37:35 · 802 阅读 · 0 评论 -
UVA 12170 Easy Climb(dp+单调队列优化)
题意:给出一个序列,首尾不可改变,要求你使序列满足相邻2个|x_i - x_(i-1)| 做法:通过枚举可以发觉每个数字只能变成a_i+k*d这种形式的数字,那么这样每个数的状态只有n^2个了,不过转移的话代价比较高,因为对于d(i,x)需要枚举d(i-1,y)| x - d AC代码://#pragma comment(linker, "/STACK:102400000,102400原创 2015-04-25 00:23:24 · 1789 阅读 · 0 评论 -
UVA 1336 Fixing the Great Wall(区间DP)
题意:修长城n个损坏点原创 2014-11-19 21:33:57 · 1503 阅读 · 0 评论 -
CodeForces - 489F Special Matrices(DP)
第一次做CF,D题好多人过没看直接做F了。结果想了好久,后来过了还是tin原创 2014-11-18 14:20:39 · 1335 阅读 · 0 评论 -
uva 624 CD(01背包问题)输出最小字典序是个问题虽然题目不要求
此题就是赤裸的01背包问题,不过路径是个问题,一开始用原创 2014-05-26 22:40:41 · 1178 阅读 · 0 评论 -
HDU 2546 饭卡(01背包)
我觉得此题其实不算原创 2014-05-26 23:05:40 · 690 阅读 · 0 评论 -
HOJ 12813 Restore Calculation(数位DP)
做了此题后明白原来这就是数位D原创 2014-07-21 18:56:46 · 680 阅读 · 0 评论 -
poj 2923 Relocation(状态压缩加上01背包)
做此题前压根不懂状态压缩是原创 2014-07-21 15:01:51 · 1044 阅读 · 0 评论 -
HDU 2639 Bone Collector II(01背包变型)
此题就是在01背包问题的基础上求所能获得的第K大的价值。具体做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,其实就是2个数组合并之后排序,但是实际做法最好不要怎么做,因为你不知道总共有多少种,而我们最多只需要前K个大的就行了(因为可能2个数组加起来的组合数达不到K个),如果全部加起来数组开多大不清楚,所以可以选用原创 2014-07-18 14:23:56 · 844 阅读 · 0 评论 -
HDU 2602 Bone Collector(赤裸裸01背包)
01背包原型。。几分钟写完,为后面原创 2014-05-25 00:13:12 · 791 阅读 · 0 评论