上一页 1 2 3 4 5 6 7 8 9 ··· 18 下一页
摘要: 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 追逐. 阅读(320) 评论(0) 推荐(0) 编辑
摘要: http://acm.timus.ru/problem.aspx?space=1&num=1180 简单推理博弈。观察每次要取的个数,1,2,4,8,16...,对3的余数分别为1,2,1,2,1...,也就是说,没有可能只用一次操作从一个3的倍数达到另一个3的倍数。 当n=3时,显然先手必胜,那么先手只要在第一次操作上使剩余石子个数为3的倍数即可。这里先手必败的情况只有一种,即n%3==0。 如何求n%3?一个貌似初中或小学就学过的但是大多数人都忘记的东西:对一个数的每一位累加,结果对3的余数与n对3的余数相同。code:#include<cstdio>intmain() 阅读全文
posted @ 2012-04-27 22:18 追逐. 阅读(230) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3294 依旧二分判定,只是要先找出最大长度,然后在根据这个长度再判定输出。对于长度相同的,用tag标记以免重复。code:#include<cstdio>//最长公共子串#include<cstring>#defineMax(a,b)a>b?a:bconstintmaxn=101001;intwa[maxn],wb[maxn],wv[maxn],ws[maxn],rank[maxn],height[maxn],sa[maxn],s[maxn],loc[maxn];boolvis[1001];charstr[10 阅读全文
posted @ 2012-04-22 18:17 追逐. 阅读(316) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1984 题目描述的如此蛋疼。。。 关系并查集,用cx和cy数组记录点与根结点的相对位置,然后根据输入依次合并,当碰到询问时便计算距离,若不在同一集合中,即无法确定相对位置。code:#include<cstdio>#include<cstring>intp[40001],cx[40001],cy[40001];intf1[10001],f2[10001],fi[10001];structedge{ints,e,l;chard;}q[40001];intabs(inta){returna>0?a:-a;}void 阅读全文
posted @ 2012-04-21 21:15 追逐. 阅读(265) 评论(1) 推荐(0) 编辑
摘要: 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 追逐. 阅读(232) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1226 求给定的字符串及其反串的最大公共子串。 后缀数组,将所有的字符串及其子串连接起来,用分隔符隔开,并给每个字符串及反串的字符标记所在串。二分答案,看是否有n个字符串或者其反串存在长为mid的公共前缀。code:#include<cstdio>#include<cstring>#defineMax(a,b)a>b?a:bconstintmaxn=10001;intwa[maxn],wb[maxn],wv[maxn],ws[maxn],rank[maxn],height[maxn],sa[maxn],s[ma 阅读全文
posted @ 2012-04-21 12:00 追逐. 阅读(210) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1743 后缀数组的简单应用。求不重叠最长重复子串。在求出sa和height数组后,二分答案,看是否存在一个区间,其height>mid且abs(sa[i]-sa[j])>=mid,即i到j的公共前缀长度大于mid,且两后缀的首字母间距不小于mid(不重叠)。#include<cstring>#defineMax(a,b)a>b?a:bconstintmaxn=20001;intwa[maxn],wb[maxn],wv[maxn],ws[maxn],rank[maxn],height[maxn],sa[maxn] 阅读全文
posted @ 2012-04-20 14:08 追逐. 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 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 追逐. 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 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 追逐. 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 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 追逐. 阅读(229) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 18 下一页