上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 18 下一页
摘要: http://poj.org/problem?id=2392 背包没有容量,对于每种木块,其能达到的最大高度a便可做为其容量。先用二进制优化减少数量,然后根据a的值排序,01背包时可以以每种木块可达到的最大高度为最大容量。RE一次,因为val的大小只开了401...这里是个易错点啊,二进制优化后的数量不确定。代码:#include<cstdio>#include<cstring>#include<cstdlib>#defineMax(a,b)a>b?a:bintdp[40005];structBlock{inth;inta;}val[4001];int 阅读全文
posted @ 2012-01-30 03:51 追逐. 阅读(218) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1276 有一个Cash Machine,里面装有t种面值为n[i]的货币,每种有v[i]张。问在所换金额不超过cash元钱的情况下,所能换取的最大金额。 多重背包,转换成01背包来做,其中要用到二进制优化。《背包九讲》上讲的挺不错,在每件物品价值前加上系数,并保证这些系数的组合包括1..n的所有数且总和为n。代码:#include<cstdio>#include<cstring>#defineMax(a,b)a>b?a:bintdp[100005];intval[105];intmain(){intcash,n 阅读全文
posted @ 2012-01-30 01:47 追逐. 阅读(174) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1260 很明显的,当vi<vj<vk且i可以用j来代替(即(si+10)*vi<si*vj)时,则当前解为最优解(因为si*vj<si*vk - -...)。 用dp[j]表示前j种pearl的最小代价,i>j&i=1...n,dp[1]=(s1+10)*v1,用第i种pearl替代前i-j种,得状态转移方程: dp[i] = min(dp[j] + (sum[i]-sum[j]+10)*val[i]) ;代码:#include<cstdio>intsum[1001],val[1001],dp[10 阅读全文
posted @ 2012-01-29 00:21 追逐. 阅读(161) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1159 卡内存的题比卡时间的题还要恶心! 用int类型提交就MLE,只能换成short int,65128K,Memory Limit:65536K...表示很无语。 不会灵活运用滚动数组,这题考查的不只是DP,应该还有滚动数组的应用。DP代码:#include<iostream>#include<cstring>usingnamespacestd;shortintdp[5001][5001]={0};charstr[5001];intmin(inta,intb){returna<b?a:b;}intmain( 阅读全文
posted @ 2012-01-28 21:44 追逐. 阅读(186) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1958 做的第一个题目给算法的题。 过程说的很明了,先把n-k个用四个柱子的方法移动到B,再把k个用三个柱子的方法移动到D,最后把n-k个用四个柱子的方法移动到D。n-k个共移动了两次,三个柱子移动的最少步数我们知道为2^n-1,总的移动步数即为f[i-j]*2+t[j],得转移方程f[i] = Min(f[i], f[i-j]*2+t[j])。 因为比较有信心,直接用大号交的,没用majia,一交就傻眼了,竟然RE!好吧,真活该,数组开那么小干嘛,又不要钱...代码:#include<iostream>#defineMin(a 阅读全文
posted @ 2012-01-28 19:41 追逐. 阅读(172) 评论(0) 推荐(0) 编辑
摘要: #include<iostream>#include<cstring>#include<cstdio>usingnamespacestd;constintnMax=1000;classedge{public:intv,nex;};edgee[nMax];intn,k,head[nMax];//head[i]是以点i为起点的链表头部voidaddedge(inta,intb){//向图中加有向边的算法,注意加上的是有向边//b为a的后续节点既是a---->be[k].v=b;e[k].nex=head[a];head[a]=k;k++;}intmain( 阅读全文
posted @ 2012-01-27 19:45 追逐. 阅读(262) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3211 小两口洗衣服,只有一种颜色的衣服洗完才能洗下一种颜色,两人同时洗问需要的最小时间。 这里一种颜色的衣服所需的总时间可以求出,求出每种颜色衣服所需最小时间便求出了ans。每种颜色的衣服总时间有了,让求两个人最短完成时间,就相当于给你一个数让你分成两份,并让这两份尽可能的小,显然这个数的一半就是答案。在这里也就是两个人洗衣服的时间尽可能相同。 怎么让一个人洗衣服的时间尽可能等于总时间的一半呢?01背包,最大容量为sum[i]/2,尽可能将背包装满即可。ans += sum[i] - dp[sum[i]/2] ;,ans便为解。代码:#i 阅读全文
posted @ 2012-01-27 17:00 追逐. 阅读(232) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2485 题不难,题目很难... 读了好几遍还是给理解错了,纠结! 就是求最小生成树里最大的边权值,拿过来poj1287一改就交,果断WA..仔细一看,权值的更新给搞错了,这是要让我郁闷到极点啊!#include<cstdio>#defineMax(a,b)a>b?a:b#defineMin(a,b)a>b?b:ausingnamespacestd;intmap[505][505];intdis[505];intn;intprim(){inti,j,ans=0,x=1;for(j=1;j<=n;j++)dis[j 阅读全文
posted @ 2012-01-22 00:44 追逐. 阅读(188) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2492题意: 一个无聊的科学家说只有两个不同性别的BUG能在一起,当然是在没有GAY的情况下。给你几对能在一起的BUG,问里面有没有GAY。刚拿到这题第一感觉就是并查集,两种关系,把不同性别的BUG放入两个不同集合里。想了一下发现根本不可行 比如1 2\n 3 4的输入,1 2放入两个集合中,3 4又得放两个集合中,明显不行。 既然不能马上确定3 4属于哪个集,能不能先存下来呢? 用一个数组记录下标元素的对立元素 read(x, y) ; a[x]=y; 当再次读到此元素时,可直接将与x不同性别的元素合并 read(x, z) ; ... 阅读全文
posted @ 2012-01-21 18:33 追逐. 阅读(945) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1042 寒假里做的第一道题,结结实实的被特给虐了。。华丽丽的WA了不下20次,最后没办法了还是让别人给找出来的错!悲催... 这题用贪心,枚举到第i个岛结束,从总时间里减掉走到这个岛所用时间。然后从前i个岛里贪心出最大值。 错在两个地方: 1. 题目要求多余的时间放到第一个岛上,我在选取的max为负里加上了cur=0,把时间直接加到了第一个岛上。 其实这里不需要单独处理,在贪心前已经让cur=0,如果max<0.fish,cur不改变。简直多此一举 2. fish数量为负时的清零跟递减的顺序,我是清零后使cur=0,然后对f[0]递. 阅读全文
posted @ 2012-01-16 22:49 追逐. 阅读(420) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 18 下一页