随笔分类 - ACM_DP
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3201 题意:给一颗树,每个节点有一个权值,求节点数为n的最大权子树。 任意选择一个节点为根,然后DP转移就可以了,类似于分组背包。。。 1 //STATUS:C++_AC_0MS_324KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 DP方程容易想出来,f[i][j]表示第i天拥有j个股票的最优解,则: 1、不买不卖,f[i][j]=Max{ f[i][j], f[i-1][j] }。 2、买进,f[i][j]=Max{ f[i][j], f[pre][k] - (j-k)*ap[i] | j>=k }。 3、卖出,f[i][j]=Max{ f[i][j], f[pre][k] +(k-j)*bp[i] | k>=j }。 直接转移复杂度O(n^3),超时。考虑第二种情况,f[pre][k] -...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题。解题思路如下(转载别人写的):dp[row][col][i][j] 表示[row,row+2^i-1]x[col,col+2^j-1] 二维区间内的最小值这是RMQ-ST算法的核心: 倍增思想== min( [row,row+ 2^(i-1)-1]x[col,col+2^j-1], [row+2^(i-1),row+2^i-1]x[col,col+2^j-1] )= min(dp[row][col][i-1][j], dp[row+(1 3 #include 4 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:给两个串S和P,求S串中存在多少个与P串的大小关系一样的串。 因为数字的范围是1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 注意到F(x)的值比较小,所以可以先预处理所有F(x)的组合个数。f[i][j]表示 i 位数时F(x)为 j 的个数,方程容易转移:f[i][1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 简单的数位DP,f[i][j][k]表示第 i 位数为 j 时余数为k的个数,然后直接找就可以了。。 1 //STATUS:C++_AC_31MS_412KB 2 #include 3 #include 4 //#include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 经典的多进程DP,比较简单。f[x1][y1][x2][y2]表示起点到点(x1,y1)和(x2,y2)的最优值,然后分层转移就可以了,每一层为斜向右的线。。 1 //STATUS:C++_AC_46MS_6172KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12...
阅读全文
摘要:题目链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=10857&courseid=55 比赛的时候把题目看成取恰好K个点了,,,悲剧。。然后按照正确的题意的话,是比较好做的,求个凸包,然后DP就可以了,f[i][j][k]表示第 i 个点到第 j 点选择k个点的多边形的最大面积,那么f[i][j][k]=Max{ f[i][j][k], f[i][y][k-1]+area(p[i],p[y],p[j]) }就可以了。。 这题相当悲剧,题目的数据范围描述错了,k应该是小于等于30,因为题目sb,
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:n个人排队,每个人有一个权值val[i]。从第一个人开始出队,进入一个栈中,每次可以留在栈中或者从栈中移出一个,如果第 i 个人是第k个出栈的,那么有sum+=(k-1)*val[i],求是的sum最小。 f[i][j]表示区间第 i 个人到第 j 个人sum的最小值,那么每次转移的时候我们只要枚举第 i 个人是什么时候出的栈就可以了,假设第 i 个人是第k个出的栈,那么f[i][j]=Min{f[i+1][i+k-1]+(k-1)*num[i]+f[i+k][j]+k*(su...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=15505 每个h[i]维护两个值l[i]和r[i],分别表示大于h[i]的左边最远距离和小于h[i]的右边最远距离,DP转一下,然后直接求。。 1 //STATUS:C++_AC_80MS_1360KB 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 typedef long lo...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29358 状态虽然很多,但是非常稀疏,dfs搜索然后剪下枝。。 或者DP,f[i][j][k]表示前 i 个物品能否到达第一个背包和第二个背包容量分别为 j 和 k 的状态,然后判断第3个背包是否能装下剩下的。f[i][j][k]=f[i-1][j][k] | f[i-1][j-v[i]][k] | f[i-1][j][k-v[i]].. 搜索: 1 //STATUS:C++_AC_10MS_1308KB 2 #include 3 #include 4 #include ...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时可以点亮,边为电线,传输有容量上限,求最多点亮多少个house。。 简单树形DP,f[i][j]表示第 i 个节点电量为 j 时最多点亮的house个数。那么f[u][j]=Max{ f[u][j], f[u][j-k]+f[v][k] | v为u的儿子节点 }。。 1 //STATUS:C++_AC_208MS_2032KB 2 #include 3 #include 4 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4689 题意:初始序列1,2...n,求所有满足与初始序列规定大小的错排数目。。 这道题目感觉很不错~ 题目数据很容易想到用压缩DP,但这题测试数据很多,状压基本都会TLE。。 f[i][j]表示前 i 个数还有 j 个+号没有放数字,-号全部放满。 当 i 为+号时:1、当前这个数不放,即放在后面的位置中,f[i][j]+=f[i-1][j-1]。2、当前这个数放在前面的位置中,f[i][j]+=f[i-1][j]*j。所以f[i][j]=f[i-1][j-1]+f[i-1][j]*...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意:给一颗树,从树上任意选择3个点{A,B,C},要求他们不在一条链上,求总共的数目。 容易想到枚举每个点,然后从每个点的所有分支中选择3个分支,然后从每个分支中选择1个点。假设点u有k个分支,每个分支的节点个数为a1,a2...an,那么方案数就是这个数列中所有3个数的积的和。直接枚举肯定会TLE的。我们可以维护3个前缀和,f1[i]表示前 i 个数选择一个的方案数,f2[i]表示前 i 个数选择两个的方案数,f3[i]表示前 i 个数选择3个的方案数。那么f1[i]就是前缀和,...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3640 题意:Cain被困在一个洞穴里,洞穴有n个出口,每个出口有一个难度值C[i],Cain有一个初始的战斗值f。现在Cain随机选择一个出口,如果f大于出后的难度,那么Cain将会花floor( (1+sqrt(5))/2*C[i]*C[i] )天出去,否则Cain的f将会增加C[i]并且消耗掉一天时间,然后重新尝试。求Cain逃出洞穴天数的期望值。。。 首先用BFS把Cain所有的f值的可能情况求出来,然后就可以列出方程,这里因为期望都是由大的f推...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:给一颗树求距离每个节点的最远距离。。 每个节点维护两个信息就可以了,f[u][0]和f[u][1],分别表示子树的最大深度和次大深度,然后一边DFS合并子树就行了。。 1 //STATUS:C++_AC_15MS_1016KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w*Min(a,b)最小。。 说白了就是要枚举每条边,然后在O(1)的时间内求出两颗子树的最长链。因此我们可以考虑用树形DP,首先一遍DFS,对于每个节点维护两个信息,hign[u]:u为根节点的子树的深度,f[u]:u为根节点的子树的最长链。然后还要维护一个hige[i][0]和hige[i][1],分别表示u为根节点的子树,不包括边 i 的深度和最长链。然后再一遍DFS,根据上一节点的信...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的substring。。 比赛那天把substing搞成了subsequence,,,sd。。。 挺水的一题,直接枚举C在A和B串中的位置,当然是最短的位置,然后求两遍A和B的最长公共子序列,一个从前往后,另一个从后往前,然后遍历枚举就可以了,O(n^2).. 1 //STATUS:C++_AC_343MS_8164KB 2 #include 3 #include 4 #inclu...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669 题意:给一串数字连乘一个环,求连续的子串中组成的新的数字能被K整除的个数。 首先容易想到用DP来解,f[i][j]表示以第 i 个数字结尾的所有前缀数中,余数为 j 的个数,那么Σ(f[i][0])就是答案。 f[i][ j*10^len(num[i])+num[i] ]+=f[i][j]。 但是这个要处理环的问题,所以我们要保证每次求的f[i][j]长度不能超过n。所以我们需要在转移f[i][j]的时候,要求出以当前数字num[i]开始的长度为n的数的余数r[i],那么在统计完...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假设有每种元素各一个,其相位是等概率随机的。如果几个元素的相位相同,那么帕琪就可以把它们组合发动一个符卡(Spell Card)。现在问帕琪能够发动等级不低于l,即包含l个相同相位的不同元素的附卡的概率。 首先所有的总数是n^m,然后只要求满足情况的数目了,对于 l >m/2我们可以直接用组合数来求的,即n*Σ( C(m,i)*(n-1)^(m-i) ),如果 l m){27 ...
阅读全文