- 博客(13)
- 收藏
- 关注
原创 UVa 10404. Bachet's Game
题意为给出总石子数n,和m堆石子,两个人轮着取石子,每次只能从总石子中取m堆中的一堆的个数的石子,取走最后一个石子的胜。S先取,O后取。用状态f【i】表示还剩i个石子时S的胜负。当为1时表示S能胜,反之则负,即O胜。转移方程为当 i -r[j]>=0而且f【i - r[j]】=0(0 #include #include #include #include #include u
2012-02-29 23:01:57 1422
原创 UVa 531. Compromise
题目意思是找两个序列的最长公共子序列,并将其打印出来。题目难点就在于如何将公共序列打印出来。 法1:此处不能仅通过dp【i】【j】 ==dp【i-1】【j-1】+1就判断s1【i】在公共序列,应先将其他情况排除之后才能判断。#include #include #include #include #include using namespace std;int dp
2012-02-29 20:14:13 1009
原创 UVa 624. CD
这道dp题做了很久,如果只是输出最大值就很简单。 是一个0-1背包问题,只是体积和价值相等而已。本来没用多久就把路径打印出来了的,只是在最后一组测试数据上跟答案有点不同,因为该数据存在两种方案。题目也没说,所以就一直纠结着怎么输出答案的方案。后来还是将原来的代码交上去了,没想到竟然是在宥多种方案时随便打印一种即可的。 #include #include #include
2012-02-29 00:35:18 1373
原创 UVa 348. Optimal Array Multiplication Sequence
本题就是矩阵连乘,只是加了一个路径打印。开始在路径打印上一直没找到规律,最后看了别人的代码才恍然大悟,其实仔细想想也挺简单的。用一个数组记录下每次断开的具体位置,然后再用递归打印出具体步骤即可。 #include #include #include #include using namespace std;int dp[11][11],p[11][11],row[11]
2012-02-28 13:51:55 917
原创 UVa 562. Dividing coins
题目大意:有一堆各种面值的硬币,将所有硬币分成两堆,使得两堆的总值之差尽可能小。开始看到题目竟然很久都找不出状态和状态转移方程,几天没做题脑袋就生锈了。申请一个dp【50001】来记录该币值能否取得,可以当成0-1背包做。然后从sum/2开始往下遍历,直到第一个标记为1的币值结束,再算一下即可。 #include #include #include #include #in
2012-02-28 12:56:21 1589
原创 UVa 10192. Vacation
本来很简单的一道dp题,可是却WA了三次,后来将输入语句改成了getline( cin , s);就AC了,题目也没说可以有空格啊,真是的... #include #include #include #include #include #include using namespace std;int dp[105][105];string s1,s2;int main(
2012-02-26 00:40:25 1299 1
原创 sicily 4834. Party Location
已知在平面上有若干个点,求一个已知半径的圆最多更覆盖多少个点。一个比较经典的问题。(另一个为已知若干个点,求能覆盖住所有点的圆的最小半径。)两两点枚举,分别以两点为圆心,已知半径画圆,若相交,则求出两圆的一个交点(两边可任意,但是每两个圆的交点都要取同一边的),然后判断以交点为圆心已知半径为半径的圆能覆盖多少个点(在圆上也算)。逐个更新ans,直到枚举完全,最后ans的值即为能覆盖住的点的
2012-02-25 22:59:06 687
原创 UVa 10003.Cutting Sticks
本题大意为在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小。开始在做时没有多想就开了一个1000*1000的数组,自己测试随便一个数据都可以,但是提交后却TLE了,估计是该题的测试案例相当多吧,不然也不会超了。后来在网上看了一下别人的答案,才猛地发现只用开一个50*50的数组就可以dp了,后来改了之后就AC。 #include
2012-02-24 21:30:54 1085
原创 UVa 674.Coin Change
经典dp问题,用记忆化搜索或者用递推(滚动数组)均可实现。 用滚动数组如下:#include #include using namespace std;int n;int f[7490];int a[5]={1,5,10,25,50};int main(){ int i,j; for(i=0;i<7490;i++)f[i]=1; //只由1组成均
2012-02-24 11:22:53 1457 1
原创 UVa 10405.Longest Common Subsequence
很简单的一个dp问题。用f【i】【j】表示s1的前i个字母和s2的前j个字母的公共最长子串,状态转移方程如下:f【i】【j】 = f【i-1】【j-1】 +1, if s1【i-1】==s2【j-1】 max( f【i-1】【j】,f【i】【j-1】), if s1【i-1】!= s2【j-1】
2012-02-24 00:55:26 531
原创 UVa 103.Stacking Boxes
dp,盒子嵌套问题。用edge【i】【j】二维数组来记录盒子i 能够嵌套到盒子j 中。在判断能否嵌套时,先将每个盒子的各个数据按从小到大排序,然后再逐项进行比较,如果每个数据都较小,则该盒子可被后者嵌套。用dp【i】表示从盒子i开始的最长盒子串。最后打印出最长盒子串时打出字典序最小的即可。 #include #include #include #include #i
2012-02-23 13:39:50 553
原创 sicily 1197. Hotel
dp问题:key[1..i] 与 w[1..j] 是否匹配?用状态f【i】【j】记录:状态转移方程如下:f【i】【j】= f【i-1】【j-1】 if key【i】== ‘?’
2012-02-23 11:33:32 627
原创 sicily 1264. Atomic Car Race
//简单的dp//由于换胎后相当于又从原点开始跑,所以在计算直达所需时间时可以优化#include #include #include using namespace std;int main(){ int n,an[101],r; double b,v,e,f,dp[101],cost[10001]; //cost[i]表示换胎后(或从起始点)行驶距离i所需时间 whi
2012-02-20 20:58:54 1019
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人