zoj 2972 Hurdles of 110m (DP)
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972 i为当前第几段,j为跑完第i段剩余的体力。第i段有三种跑法可选: 第一种要消耗f1的体力,所以保证j+f1<=m。dp[i][j] = min(dp[i][j], dp[i-1][j+f1]+t1) ; 第二种不消耗体力。dp[i][j] = min(dp[i][j], dp[i-1][j]+t2) ; 第三种增加f2的体力,保证j-f2>=0。dp[i][j] = min(dp[i][j], dp[i-1][j-f2]+t3) ; 还有一种情况需要单
阅读全文
posted @
2012-04-28 21:56
追逐.
阅读(326)
推荐(0)
poj 2385 Apple Catching (DP)
摘要:http://poj.org/problem?id=2385 dp[i][j], i为第几分钟,j为走了几次。则dp[i,j]=max(dp[i-1,j-1], dp[i-1][j])+(data[i]==(j%2+1)?1:0)。对data[i]==(j%2+1)?1:0,若j为奇数,则其必在2号树下,所以+1,反之+0。code:#include<cstdio>usingnamespacestd;intdp[1005][35];intapp[1001];intmax(inta,intb){if(a>b)returna;returnb;}intmain(){inti,j,t
阅读全文
posted @
2012-04-21 20:54
追逐.
阅读(238)
推荐(0)
poj 3661 Running (DP)
摘要:http://poj.org/problem?id=3661 到达终点的方式有两种,一是从n-1走到n,二是从某一节点休息到n。 dp[i][j],i代表第几分钟,j代表当前忍耐度。 对于第一种情况,dp[i][j]=dp[i-1][j-1] + d[i] ; 第二种情况,dp[i-1][0]已经计算出来,设dp[i][0]初值为dp[i-1][0],也就是说在i-1分钟忍耐度为0时继续休息到i。 那么dp[i][0] = Max(dp[i][0], dp[i-k][k]) ;code:#include<cstdio>intdp[10005][505];intd[10005];in
阅读全文
posted @
2012-04-15 10:15
追逐.
阅读(239)
推荐(0)
poj 3280 Cheapest Palindrome (DP)
摘要:http://poj.org/problem?id=3280 对字符串进行增删操作使其形成回文串,每次操作都有其对应的花费,求最小花费。 典型DP,dp[i][j]为使str[j, i]形成回文的最小花费。 若str[j]==str[i],则dp[i][j]由dp[i-1][j+1]而来。 若str[j]!=str[i],则dp[i][j]=min(dp[i-1][j]+v[data[i]], dp[i][j+1]+v[data[j]]) ;v[data[j]]为增减字符j所花费最小值,因为增加一个字符和减少一个字符起到的效果是相同的,所以预处理出数组v即可。 练习赛时就是没想到预处理这一..
阅读全文
posted @
2012-04-14 21:45
追逐.
阅读(213)
推荐(0)
poj 1252 Euro Efficiency (完全背包)
摘要:http://poj.org/problem?id=1252 先计算6种钱币相加的情况,有f[j] = min(f[j], f[j-data[i]]+1) ; 然后计算找零的情况,有f[j] = min(f[j], f[j+data[i]]+1) ; 计算的上限要比100大,因为有找零的情况,但是要大多少不太好确定。code:#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintMax=2500;//..intdata[6],f[Max];intmain()
阅读全文
posted @
2012-04-14 08:37
追逐.
阅读(237)
推荐(0)
zoj 1428 Magazine Delivery (DP)
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1428 今天练习赛的题目,我先读的,以为是图论,叫XSY去看,结果越弄越理不清头绪。。最后没办法只能放弃。 下午结束后才知道原来是道DP。以三辆车的位置为状态,j,k为不动的车位置,i为当前移动车的位置。dp[j,k,i]可由dp[j,k,i+1],dp[j,i,i+1],dp[k,i,i+1]移动一次达到。 另外长了个记性,以后绝对不再使用宏定义了,宏定义的取最值方法老是出错,找不出来原因。code:#include<cstdio>#include<c
阅读全文
posted @
2012-04-11 23:12
追逐.
阅读(251)
推荐(0)
hdu 2686 Matrix (多进程DP)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2686 多进程DP,昨天第一次听说... 题目大意是找两条从(1, 1) 到(n, n)的路径,使权值和最大且节点不重叠。 让两个进程同时进行,枚举步数K,当x1==x2||y1==y2时跳过,得状态转移方程: dp(k, x1, y1, x2, y2) = max(dp(k-1, x1-1, y1, x2-1, y2), dp(k-1, x1-1, y1, x2, y2-1), dp(k-1, x1, y1-1, x2-1, y2), dp(k-1, x1, y1-1,x2, y2-1)) + ...
阅读全文
posted @
2012-03-25 14:30
追逐.
阅读(417)
推荐(0)
hdu 3507 Print Article (DP, Monotone Queue)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3507 斜率优化的DP,完全是看资料做出来的。下面给出资料中对两个结论的证明: 对基本公式f[i]=min{f[j]+(s[i]-s[j])^2+M},取i的两个一般决策点j,k(j<k),s[i]为1..i的cost总和,因为cost非负,所以s随i不减。 若k优于j,则f[k]+(s[i]-s[k])^2+M<f[j]+(s[i]-s[j])^2+M,化简得f[k]-f[j]+s[k]^2-s[j]^2<2*s[i]*(s[k]-s[j])。 由于j<k,则s[k]>s[j]
阅读全文
posted @
2012-02-10 04:39
追逐.
阅读(927)
推荐(0)
poj 2392 Space Elevator (多重背包)
摘要: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
追逐.
阅读(230)
推荐(0)
poj 1276 cash machine (多重背包)
摘要: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
追逐.
阅读(187)
推荐(0)
poj 1260 pearls (dp)
摘要: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
追逐.
阅读(177)
推荐(0)
poj 1159 palindrome (dp)
摘要: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
追逐.
阅读(200)
推荐(0)
poj 1958 Strange Towers of Hanoi (dp)
摘要: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
追逐.
阅读(183)
推荐(0)
poj 3211 Washing Clothes (01)
摘要: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
追逐.
阅读(240)
推荐(0)
poj 3628(01_page, dfs)
摘要:http://poj.org/problem?id=3628 读完题感觉就是一01背包,仔细想想确又没什么好的思路,感觉只能暴力水水... 看了下discuss里讨论的,写了第一个代码#include<cstdio>#include<cstring>usingnamespacestd;intheg[21];boolf[20000001];intmain(){intn,h,i,j;while(~scanf("%d%d",&n,&h)){intsum=0;intmin=200000000;for(i=0;i<n;i++){scanf
阅读全文
posted @
2011-11-20 22:03
追逐.
阅读(264)
推荐(0)
hdu 2159 (完全背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2159#include<cstdio>#include<cstring>#definemax(a,b)a>b?a:busingnamespacestd;intdp[105][105];structpage{intw;intv;}pg[105];intmain(){intn,m,k,s,i,j,h;while(~scanf("%d%d%d%d",&n,&m,&k,&s)){for(i=1;i<=k;i++)scanf(&qu
阅读全文
posted @
2011-11-17 22:15
追逐.
阅读(290)
推荐(0)
hdu 2191(多重背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2191 转化为01背包问题,只是将原来的放或不放第i件物品改为放几件第i件物品。#include<cstdio>#include<cstring>#definemax(a,b)a>b?a:busingnamespacestd;intdp[105];structpage{intweight;intvalue;intnum;}pg[105];intmain(){intt,n,m,i,j,k;scanf("%d",&t);while(t--){scanf(&
阅读全文
posted @
2011-11-14 23:14
追逐.
阅读(261)
推荐(0)
poj 1837 Balance
摘要:题目链接:http://poj.org/problem?id=1837 用DP求解,相当与01背包。起初依然是没有想到具体的思路,看了下解题报告后发现与01背包如此接近。 从此题开始进入DP模式...#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intdp[20][15010],C[25],G[25];intmain(){intc,g,i,j,k;while(~scanf("%d%d",&c,&g)){for(i=1;i<=c
阅读全文
posted @
2011-10-16 20:48
追逐.
阅读(201)
推荐(1)
poj 1050
摘要:题目链接:http://poj.org/problem?id=2479 #include<iostream>#include<fstream>#include<cstring>usingnamespacestd;intmain(){fstreamcin("x.in");intn,i,j,k,h,g,ans=-9999;inta[105][105],dp[105],b[105];while(cin>>n!=0){for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>a[i][j];fo
阅读全文
posted @
2011-09-26 22:55
追逐.
阅读(158)
推荐(0)
poj 2479 Maximum sum
摘要:题目链接:http://poj.org/problem?id=2479 基础DP题,跟以前做的最大子段和差不多。数据量比较大,一开始用cin,cout输入输出,超时,改成scanf就好了。#include<iostream>#include<fstream>#include<algorithm>#include<cstring>usingnamespacestd;intdp[50005],a[50005];intmain(){//fstreamcin("x.in");intt,n,i;memset(dp,0,sizeof(dp
阅读全文
posted @
2011-09-25 22:36
追逐.
阅读(168)
推荐(0)