dp
文章平均质量分 61
Baoli1008
233
展开
-
hdu 4901 The Romantic Hero
题目链接:点击打开链接题意dp题,数组dp1原创 2014-08-01 18:56:02 · 354 阅读 · 0 评论 -
POJ 1141 Brackets Sequence (区间DP)
这是一道挺好的区间DP题,类似往一个序列里插入东西的问题都可以往从中间分开考虑两块这个方向去想。dp[i][j]表示i到j这一段最少需要插入括号的数量,显然这个数等于min(dp[i][k],dp[k+1][j]),其中0另外如果s[i]和s[j]匹配,还可能等于dp[i+1][j-1],注意这个更新不一定是优先的,比如()(),如果优先去掉两边变成)(,最终dp[0][3]结果为原创 2015-04-18 10:11:54 · 456 阅读 · 0 评论 -
POJ 1015 Jury Compromise(DP)
dp[i][j]记录由i个人组成,差值为j的陪审团的最大和注意不能只保存一个绝对值,要两个值都保存。所以要把所有差都加上400,即把dp[0][400]初始为0,其他都初始为-1要维护的有:dp[i][j]状态中已经有的人vis[i][j][k]G[i][j]是组成dp[i][j]的所有人的集合o[i][j],d[i][j]是辩方和,控方和代码://// main.原创 2015-04-11 21:24:09 · 519 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼(DP)
有区间限制的树形DP开始以为等级限制为M时,只要等级和酋长的等级之差在小于等于M即可,实际上这是错的,因为可能有人的等级高于酋长,这些人和低于酋长的人的等级差可能大于M。因此想到了枚举区间,然后在DP时只考虑在选定区间中的物品。枚举区间的方法是先枚举区间长度,在枚举区间起点。代码://// main.cpp// 1062 昂贵的聘礼//// Created原创 2015-04-08 09:00:46 · 466 阅读 · 0 评论 -
POJ 1170 Shopping Offers (状压DP)
首先确定dp的状态是购买当前这些物品所需要的最小价值,显然对于每个打折方案,都可以到达一个其他状态,也当前物品就是加上那个方案新买的物品,并获得一个新价值。用这个新价值去更新新状态,就是一个典型的完全背包。剩下的就是找到一个方法来表示每个状态。因为每种物品最多5个,所以想到用6进制来状压(注意可能的数量是0~5,6种情况,不是5种)。最多5种物品,因此状态数最多6^5。代码:#原创 2015-04-20 20:44:35 · 786 阅读 · 0 评论 -
POJ 1080 Human Gene Functions(DP)
设两个字符串为a,bdp[i][j]表示a[1]到a[i]和b[1]到b[j]的最大匹配度。线性递推过去,dp[i][j]有3种情况:dp[i-1][j-1]+m[i][j];dp[i][j-1]+d[j];dp[i-1][j]+d[i];对应不放空白,上面放空白,下面放空白,m表示矩阵,d表示第i个字母和空白的匹配值。注意初始化时,dp[0][0~len1],原创 2015-04-09 19:41:28 · 482 阅读 · 0 评论 -
POJ 1661 Help Jimmy (DP)
dp[i][0] dp[i][1] 记录到第i个平台左右两端点时最短时间。预处理出每个平台左侧,右侧都能到达哪个平台。根据这个关系DP,复杂度N方。算出起始平台两侧的dp[i][0],dp[i][1],作为初始条件,向下DP。注意:1.只有当下面的平台的值被更新过,才继续向这一侧DP,否则停止。2.注意起始点直接落地的情况。代码:#include #i原创 2015-05-02 11:11:59 · 438 阅读 · 0 评论 -
POJ 2096 Collecting Bugs (期望DP)
令(n,s)为一状态,表示找到了n种不同的类别的,s种不同的bug,可以转移为(n,s),(n,s+1),(n+1,s),(n+1,s+1)根据概率公式很容易列出转移公式,在这里不再赘述。注意公式两边都是有(n,s)的,移项后就是可以编程的公式了。用记忆化搜索做。代码:#include #include #include #include using namespa原创 2015-05-27 15:55:18 · 498 阅读 · 0 评论 -
POJ 3071 Football (概率DP)
设dp[i][j]表示第i轮j还未被淘汰的概率,则dp[i][j]=dp[i-1][j]*dp[i-1][k]*p[j][k] (枚举k求和)。问题在于,在第i轮时,j有可能和哪些球队碰上。这个是和j的二进制表示有关的。比如当i==1时,j只能和 j二进制表示最后一位取反后的那个数所对应的球队踢,当i扩大后可能对上的球队范围也增大。我比较麻烦的写了二进制拆分,模拟判断可能对阵的球队。原创 2015-05-27 18:44:38 · 481 阅读 · 0 评论 -
POJ 3156 Interconnect(期望DP)
本题中图的具体形式是没有意义的,状态应该是联通块数量和大小,用数组记录这种状态。比如(3,3,2)表示3个联通块,分别有3,3,2个点,它可以转移为(6,2)和(5,3)。很好理解转移到(6,2)的几率为3*3/(8×7/2),即:可改变状态的边和总边数之比,这样状态到状态间的概率就可求了。期望DP要逆着推。设状态a可以到x,y,z,假设x,y,z到全联通的期望步数已求,为dp[x,y,z原创 2015-05-22 18:01:13 · 636 阅读 · 0 评论 -
POJ 3744 Scout YYF 1(概率递推)
首先考虑什么情况下能安全通过,安全通过不能踩到任何一个雷,如果能算出到达每个位置的概率,pos[i]表示第i个雷的位置,那么答案就是(1-pos[i])的乘积。概率的转移公式很好想:dp[i]=p*dp[i-1]+(1-p)*dp[i-2]。问题在于范围太大。打表后发现当递推次数超过100时后面每个位置的概率都一样。所以两个雷之间距离过大的话,只要算100次就行了。这道题标准做原创 2015-05-22 20:12:59 · 532 阅读 · 0 评论 -
POJ 2151 Check the difficulty of problems (概率DP)
问题的解等于(所有队都做出至少一题的概率 - 所有队做题数都在1到N-1之间的概率)设计DP状态时,因为DP过程中要记录哪些题做过了很难,一般来说要把DP的过程设计成有方向的,比如有一维表示前i个XX这种。dp[i][j][k]表示第i队前j题做出k个的概率,dp方程就是dp[i][j][k]=dp[i][j-1][k-1]*acr[i][j]+dp[i][j-1][k]*(1-acr[i原创 2015-05-23 11:24:31 · 486 阅读 · 0 评论 -
Codeforces 559C Gerald and Giant Chess(DP+乘法逆元求大组合数)
先把黑块按坐标排序。dp[i]表示到第i个黑块且之前没有经过黑块的方案数,那么每一个dp[i]中的方案都是完全不相同的。递推的方法是dp[i]=C(xi+yi,xi)-sum(dp[j]*C(xi-xj+yi-yj,xi-xj)) (jdp[j]*C(xi-xj+yi-yj,xi-xj)就是从1,1经过第j个黑块到i的路径数,用总路径数减去所有的这些不合法的路径数就是dp[i],(剪去的原创 2015-07-24 10:30:25 · 1298 阅读 · 0 评论 -
UVa 10917 Walk Through the Forest(最短路+DP)
求出办公室到每一点的最短路d[i],然后记忆话搜索,dp[i]由和i点相邻且d[j]代码:#include #include #include #include #include #include #define INF 10000000using namespace std;int N,M;struct edge{ int s,t,c;};vect原创 2015-03-30 22:34:41 · 608 阅读 · 0 评论 -
UVa 11825 Hackers' Crackdown(二进制压缩+DP)
本题课抽象成给出一些集合,求最多能有多少组集合,使每组的并集是全集。这里面每个集合就是每个点以及和他们邻近的点。点最多有16个所以想到用2进制压缩。首先在输入时用二进制记录下每个节点及邻接的节点的集合a[i]。然后枚举这些节点的组合(同样用二进制的方法)对于这些组合进行dp,dp的转移:设S是一个集合,S0是它的子集且并集是全集,dp[S]=max(dp[S0])+1代原创 2015-01-20 19:14:19 · 686 阅读 · 0 评论 -
UVa 10635 Prince and Princess(最大公共子序列)
本题相当于按照第一个人的序列为每个出现的数重新标号,按这些标号转换第二个序列,再对第二个序列求最长上升子序列。求最长上升子序列需要O(nlogn)的方法。用d[i]表示到i位置最长序列长度,那么如果两个序列长度一样,结尾数大的那个序列一定可以被另一个小的代替。用g[i]表示长度为i的序列中,结尾数最小的数。每次对于新的位置在g数组中二分出第一个大于它的数g[i] ,那么g[i-1]的数比它原创 2015-01-20 10:03:04 · 479 阅读 · 0 评论 -
poj 1036 Gangsters(DP)
题目链接:点击打开链接原创 2014-09-10 22:21:27 · 507 阅读 · 0 评论 -
poj 1042 Gone Fishing(DP)
题目链接:点击打开链接 点击打开链接原创 2014-09-13 22:47:06 · 528 阅读 · 0 评论 -
poj 1050 To the Max(最大子矩阵和)
题目链接:点击打开链接求2维的最大字段和,原创 2014-09-15 10:49:42 · 600 阅读 · 0 评论 -
hdu 5074 Hatsune Miku(dp)
dp[i][j]表示处理到第i位时最后一个数是j的zuida原创 2014-10-31 09:56:08 · 449 阅读 · 0 评论 -
poj 1157 LITTLE SHOP OF FLOWERS(DP)
dp[i][j]表示处理到了第i束花,且第i束花在第j个花瓶里。转移就是dp[i][j]=m原创 2014-10-31 11:15:25 · 413 阅读 · 0 评论 -
poj 1014 Dividing(多重背包可行性解)
多重背包可行性模板题(能否把背包装满)用了背包jiuji原创 2014-10-31 16:12:48 · 605 阅读 · 0 评论 -
poj 1160 Post Office(DP)
dp[i][j]表示前i个村庄中设置j个邮局之后的最小距离和。原创 2014-10-31 18:13:53 · 524 阅读 · 0 评论 -
hdu 4815 Little Tiger vs. Deep Monkey(数学+dp)
首先要知道一个公式就是Deep Monkey得到的分数原创 2014-11-06 14:13:24 · 651 阅读 · 0 评论 -
UVa 10564 Paths through the Hourglass(DP)
转移类似背包问题,上下三角分开处理。要求字典序最小,所以要从下到上DP。代码:#include #include #include #include using namespace std;#define LL long longLL d[41][21][505];int N,S;int a[41][21];bool C(int i,int j){ if(原创 2015-01-30 07:49:49 · 450 阅读 · 0 评论 -
UVa 10817 Headmaster's Headache (状压DP)
一个需要状态压缩的0-1背包。dp[i][j]中第一维表示每个学科有没有第一个老师教,第二维表示每个学科有没有第二个老师教,这两个信息是要状压的。对于0-1背包,如果写成dp[i]=max(dp[i],dp[i-w[k]]+c[k])的形式,就要判断i-w[k]是不是大于等于0。在这道题里判断相似的问题有些麻烦,所以写成dp[i+w[k]]=max(dp[i+w[k]],dp[i]+c原创 2015-01-30 12:33:59 · 511 阅读 · 0 评论 -
CodeForces 430D Working out(DP)
They have to meet in exactly one cell of gym.本题要求两人只能相遇一个格子,如果确定了相遇的格子,答案就是从这个格子往四个角能获得的最大值,从4个角往各个点DP即可。为了保证只有一个格子相遇,枚举相遇格子后,更新的值应该是这个格子上下左右四个格子的DP值,共有两种情况,这样可以保证这些路线没有相交。边界上的点一定不能是相遇的格子,那样至少有两原创 2015-02-02 19:04:06 · 672 阅读 · 0 评论 -
POJ 1276 Cash Machine(多重背包)
把每种物品二进制拆分成log C[i]种当A[i]*C[i]>=Cash时是完全背包,否则对这些拆分后的物品是01背包(两者区别只在于第二重循环的顺序)具体见刘汝佳小白书代码:#include #include #include using namespace std;int dp[100005];int a[15];int c[15];int N,M;i原创 2015-01-19 10:49:16 · 396 阅读 · 0 评论 -
UVa 10891 Game of Sum(DP)
dp[i][j]表示在i到j这个子序列中先手可以获得的最大分数。初始状态所有的dp[i][i[]都为a[i]转移方程是dp[i][j]=Sum(i,j)-min(dp[i+1][j]~~dp[j][j],dp[i][j-1]~~dp[i][i],0) 即先手拿走一部分后相当于在剩下的部分中对方先手,让对方得的最少自己得的就最多。min中最后的0表示开始直接全部拿完。用L[i][j]表示原创 2015-01-20 11:52:10 · 403 阅读 · 0 评论 -
Codeforces 570E - Pig and Palindromes (DP)
状态dp[cnt][x1][y1][x2][y2]表示左边从起点开始走cnt步到x1,y1,右边从终点开始走cnt步到x2,y2的方案数。因为知道cnt和x1,x2的话就能求出y1,y2,所以可以做个空间优化。但是这样还不够,因为cnt状态只和cnt-1状态有关,所以可以用滚动数组。转移方程就是当mp[x1][y1]==mp[x2][y2]时(mp为迷宫):dp[cnt][x1][x2原创 2015-08-21 10:40:59 · 562 阅读 · 0 评论