随笔分类 -  ACM——DP

摘要:http://poj.org/problem?id=1276才开始自己写了一下转换成01背包的做法,直接tle。。计算一下就知道会tle了。然后写了一下二进制思想的方法,终于A了。。。背包好久没看了,自己还是不是很扎实啊View Code #include <iostream>#include <cstdio>#include <cstring>#define maxn 100007#define N 11using namespace std;int f[maxn];int c[N],b[N];int V,n,m;void zb(int c,int w,i 阅读全文
posted @ 2012-04-26 23:22 E_star 阅读(182) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4109给定N个指令,其中有部分指令存在先后时间上的顺序,给定m个,x, y, z 即y必须在x执行完z秒后才执行,求 最少的时间。首先根据拓扑排序找出入度为0点,处理,而对于有限制的一些点来说,dp[i] = max(dp[i],dp[j] + w) j 是i的临接点,w是i与j 的时间差。边表不是很熟,同时也练习了一下边表。。View Code #include <cstdio>#include <cstring>#include <iostream>#include & 阅读全文
posted @ 2012-04-23 21:43 E_star 阅读(278) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1463对于树形DP不大来感啊,才开始做的时候考虑成覆盖全部点了,致使我拓扑做了,WA了好几次。感觉是树形DP好像以前做过类似的题目可是就是想不出来怎么做了,看来还是不扎实。最后搜了一下解题报告,对于每一点只有放与不放两种状态,如果这一点放了士兵那么他的临接点可以放也可以不放,如果这一点没有放那么他的临接点一定放了。由此得出dp[i][0]+= dp[j][1] dp[i][1] = min(dp[j][0],dp[j][1])(j属于i的临接点) dp[i][0] 表示i点不放士兵 dp[i][1] 表示i 点放士兵。。随便由一点出发,.. 阅读全文
posted @ 2012-04-23 20:51 E_star 阅读(198) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1837题意:给你一个类似于天平的秤,秤有左右臂膀。左右臂有c个挂钩,给定g个重物,要求把所有重物都挂在钩子上,并且是天平平衡。求最多可能得到的数。左边力乘以力矩 = 右边力乘以力矩挂在左边的得到负数,挂在右边得到正数,只要我们的到的数为0就表明此时天平平衡。由于数组下表不能为负,所以我们要加上一个偏移量b = 20*15*25 = 7500 所有重物都挂到一端取最大重量则我们得到的结果dp[g][0] 就等于dp[g][7500] 了(加上偏移量)dp[i][k + val[i]*pos[j] + b] += dp[i - 1][k + b 阅读全文
posted @ 2012-04-20 21:21 E_star 阅读(396) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2151题意是:对于acm出题,出m到题,你要保证每支队伍至少做出一道题目,并且冠军队伍要做出至少n道题目;我们只要求出所有队伍至少解决一道题目的概率(pa),和所有队伍解决出(1--n -1)到题目的概率pb,然后pa-pb就是我们所需要的答案了。。dp[i][j][k] 表示第i支队伍,在前j道题目中,解决了k道题目的概率;则有dp[i][j][k] = dp[i][j - 1][k]*(1 - p[i][j]) + dp[i][j - 1][k - 1] *p[i][j];分第j道题目做出来与没做出来两种情况dp[i][j][0] = 阅读全文
posted @ 2012-03-29 16:36 E_star 阅读(221) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3267从后往前推,只要发现匹配的就进行匹配。dp[i] = min(dp[i) ,dp[t] + t - i - len[j])dp[i]表示在i位置至少要删掉多少个字母,t记录了完成单词匹配后的下一个位置,t - i - len[j]表示在i起始位置完成单词匹配这个中间最少要删去的单词数View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 307using namespace std;char str[6 阅读全文
posted @ 2012-03-14 09:32 E_star 阅读(242) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1520学校举行周年纪念日party,要求是直接上司和下属关系的员工不能同时参,给出树形关系图,求怎样邀请的人的列表是的总rating最大。每个人都对应着一个rating首先建立无向图,然后以以1节点为根节点,dfs从叶子往根推。。dp[i][0] 表示i节点不邀请是的最大rating,dp[i][1]表示i节点要请示最大的rating转台转移方程dp[i][0] += max(dp[son[i]][1],dp[son[i]][0]); i没被邀请,所以他的孩子可以邀请也可以不邀请,我们只要最大rating.. 阅读全文
posted @ 2012-02-11 15:56 E_star 阅读(387) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2196看了很长时间都没看懂,解题报告也是乱的让人头疼。最后问了一下von的思路,然后看了看代码终于明白了。这题真的很难。首先按所给信息建图,建立的是有向图。然后将1视为根节点第一遍dfs从叶往根递推,求出每个点所能到达的最远距离和次远距离,只有当这一个点有多条分支时才存在次远距离(注意这里是有方向);该点所能到达的最远距离可能是第一遍dfs搜到最远距离,也有可能由父亲节点+父亲节点与该节点的距离所得。所以第二遍dfs从根节点1出发往树叶边遍历。f[i]存最长距离,l[i]存次长距离,dp[i]存由父亲节点延伸 阅读全文
posted @ 2012-02-11 14:06 E_star 阅读(295) 评论(0) 推荐(0)
摘要:树形DPhttp://acm.hdu.edu.cn/showproblem.php?pid=2196√向下搜一遍,向上搜一遍http://acm.hdu.edu.cn/showproblem.php?pid=1561√对每一个节点进行一次背包,好题啊,两个DP树形和背包结合的http://acm.hdu.edu.cn/showproblem.php?pid=1011√这道是当年省赛的压轴题,但是感觉和上一道差不多,一样的难度,唯一不同的就是这个是无向图(我由于思维惯性拿来当单向图作,纠结了好久。。。)树形+背包+临街表下边是从天涯空间里找出来的练习http://acm.pku.edu.cn/J 阅读全文
posted @ 2012-02-11 10:11 E_star 阅读(287) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1561同hdu1011只是这里做的小处理是将0点加入,将原来的森林变成了树,这样就可以按照树形dp展开来做了。。dp[i][j]表示从i点往后占领j个城市所获得的总的最多宝物dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son[i]][k])View Code #include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cst 阅读全文
posted @ 2012-02-08 16:13 E_star 阅读(259) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1011dp[i][j]表示在第i个位置放j个trooper,然后又该节点分配给子节点后所能得到的最大brains;状态转移方程dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son[i]][k]);从叶子节点往根节点递推。。。View Code #include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring># 阅读全文
posted @ 2012-02-08 14:53 E_star 阅读(221) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1742多重背包的题目:才开始不知道怎么来统计最后可以给出多少种价格,因为以前的形式都是给出c[i],w[i],b[i]的这里没有给出,后来自己yy了一下,利用多粗冲背包向01背包转换的第一种方法后最后从1到V里所有出现的不同的金钱数量不就是最终可以给出的各种价格吗。01背包转换的第一种方法o(n^3)肯定会TLE代码如下:View Code #include <iostream>#include <cstdio>#include <cstring>using namespace std;const int 阅读全文
posted @ 2011-12-08 16:42 E_star 阅读(768) 评论(0) 推荐(0)
摘要:1001http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1001&cid=13996原来做过的一道题目,我用的贪心,按比重从大到小排序,然后依次选直到不能再放进来为止。注意两点:1:F[j]可能为0因为题目中说的非负数。记得第一次做的时候wa无数次。。2:选完的时候有2种可能:1:n恰好用完,最后不能再选;2:n有剩余,可能n比较大把所有的都选了还有剩余,可能中间出现不能全部将这间屋子里的换完只能换部分。View Code #include <iostream>#include <cstdio>#inc 阅读全文
posted @ 2011-12-06 16:46 E_star 阅读(228) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1506才开始以为从前往后找出连续的最长上升序列就行,结果一分析数据根本不行,然后从左往右找出分别找出来上升的最长自序列+连续下降的子序列然后分别求,最后取最大。结果还是不行,卡住了。原来是分别记录该点可延伸的最左边L[i]以及最右边R[i]最后由该点可形成的最大区域面积就是s=a[i]*(R[i]-L[i]+1);在求L,R是不能一个一个的往回找,肯定会超时,而是利用迭代的思想(想当于记录数组吧(dp))来推导。。由于自己的粗心重定向有没去掉贡献了一次无意义的wa。。呜呜。View Code #include 阅读全文
posted @ 2011-12-02 20:52 E_star 阅读(205) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1864一个0-1背包的题目,自己对背包的理解还是不好啊。将所给的最大报销费用当做背包体积,这里的最大陷阱是单项物品的价值不得超过600元(指的的是这一类产品)贡献了很多wa无语,还有就是数据的处理了。(计算内存1k=1024b);View Code #include <iostream>#include <cstring>#include <cstdio>using namespace std;const int max_s = 3000001;//靠计算的。。int f[ 阅读全文
posted @ 2011-12-02 16:57 E_star 阅读(238) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=295501背包的变形,才开始我就是按这别人说的脑残的办法将概率扩大100000被后计算,概率连续着加。。一直wa中。。无语 啊。最后原来是概率要连成乘的啊。。而且这里把抢劫的钱作为背包体积,V等于抢劫抢得最多的钱,然后直接套用01背包。。View Code #include <iostream>#include <cstdio>#include <cstring>using namespace std;double f[99999],p[107];int c[107];in 阅读全文
posted @ 2011-11-29 23:10 E_star 阅读(208) 评论(0) 推荐(0)
摘要:1001:求最大子段和,关键是判断当前位置选与不选的状态状态转移方程:dp[i]=max(dp[i-1]+a[i],a[i]);还要记录起点与终点(单独开了一个结构体记录到达每个点的起点与终点)http://acm.hdu.edu.cn/showproblem.php?pid=1003View Code 1 #include <cstdio> 2 #include <cstring> 3 int dp[100007],a[100007]; 4 struct node 5 { 6 int s,e; 7 }p[100007]; 8 int main() 9 {10 int 阅读全文
posted @ 2011-11-29 13:50 E_star 阅读(297) 评论(0) 推荐(0)
摘要:http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/F一个素数帅选法的题目,才开始直接就套模板结构tle应为被题目中的As many as 1000 lines, 给坑了总的时间消耗是1000*10^5.。这样暴力枚举的话肯定会超时,当时就急了,一下把10^5以内的素数都搜出来了,打表水过。。然后为了问日华,原来在素数帅选完了以后再用dp处理一下就好了。。#include<iostream>#include<cstring>#include<cstdio>using 阅读全文
posted @ 2011-11-27 00:50 E_star 阅读(473) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1028以为是个很简单的递推可是退了三页信纸都没推出来,最后还是看了人家的结题报告,好高深啊。。不好推;这里粘一下人家的吧,感觉很好:在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记为q(n,m)。可以建立q(n,m)的如下递归关系:<1>q(n,m) = 1, n >= 1当最大加数n1不大于1时,任何正整数n只有一种划分形式,n = 1 + 1 + 1 +...+ 1<2>q(n,m) = q(n,n), m >= n最大加数n1实际上不能大于n<3& 阅读全文
posted @ 2011-11-23 23:49 E_star 阅读(249) 评论(0) 推荐(0)