UVA
文章平均质量分 56
Wall_F
这个作者很懒,什么都没留下…
展开
-
UVa 10739 String to Palindrome String to Palindrome
大意不再赘述。思路:这道题我也思考了好久,最先的思路也是从两边开始判断是否相等,但是有一个操作非常麻烦,就是添加一个字母,这个不好操作,而且我也无法证明它具有最优子结构,所以就一直耗着,然后过了几天去网上查了下资料,原来不需要添加一个字母,这样就简单多了。#include #include #include #include #include #include using na原创 2013-01-11 22:47:46 · 592 阅读 · 0 评论 -
UVA 11029 Leading and Trailing
大意不再赘述。思路:后三位比较简单,前三位其实也比较简单。如x = 123456,我们转换一下:x = 1.23456 * 10^5,即log(x) = 5 + y;有了这个式子我们就可以知道,10^y一定等于1.23456,不信你可以去试试。然后前三位就是10^y*100咯。前4位,前5位...n位其实都类似,关键是掌握题目的方法。还有一个要注意,可能最后3位mod100原创 2013-01-16 22:49:28 · 1408 阅读 · 0 评论 -
UVA 10453 Make Palindrome
大意:求一个字符串在通过在任意位置增加一个字符使得变为一个回文串的最小操作数及打印出该回文串。思路:由于增加一个字符不太好操作,我们把问题转换一下。这里需要用到一个结论,即增加字符变为回文串与减少字符变为回文串的最小操作数是相同的,这里可以用手模拟几种情况,就可以得出这个结论。有了这个结论之后,我们就可以来写题了。那么状态转移方程即为:d[i][j] = d[i+1][j-1]原创 2013-01-17 00:36:14 · 740 阅读 · 0 评论 -
UVA 11121 Base -2
大意:将一个十进制的数转换成-2进制的数。思路:与转换为2进制类似,只不过迭代时,当n为负数的时候,n % base的值可能为-1,而我们不允许-1出现,则把-1替换为-1 -= base;而替换之后减少的那一部分的值需要在迭代的时候加回来。有一个人讲的比较清楚:http://www.cnblogs.com/scau20110726/archive/2012/12/21/2828420原创 2013-01-17 18:00:09 · 856 阅读 · 0 评论 -
UVA 10891 Game of Sum
大意不再赘述。思路:经典的区间DP,于是利用d[i][j]表示当前A在区间i~j内取得的最大数,决策是取1~j-k+1个数,那么状态转移方程即可表示为:d[i][j] = max(d[i][j], Sum(i, j)-min(dp(i+k, j), dp(i, j-k)));表示在i~j内A能取得的最大数,由于许多重复子问题的存在,可以选用记忆化搜索,注意边界问题。答案即是:d原创 2013-01-17 21:54:29 · 1548 阅读 · 0 评论 -
UVA 10304 Optimal Binary Search Tree
大意略。思路:参见《算法导论》P215.#include #include #include #include #include using namespace std;const int MAXN = 260;const int INF = 0x3f3f3f3f;int n;int d[MAXN][MAXN];bool vis[MAXN][MAXN];int原创 2013-02-02 22:03:29 · 668 阅读 · 0 评论 -
UVA 11151 Longest Palindrome
大意不再赘述。思路:由于是求长度,所以我们可用状态方程:d[i][j]表示在区间i~j内的最大回文子串,边界条件为d[i][i] = 1;d[i][j] = d[i+1][j-1]+2;str[i] == str[j]d[i][j] = max(d[i+1][j], d[i][j-1]); str[i] != str[j]题目说空串也是回文子串,长度为0。#include #原创 2013-01-18 14:34:56 · 750 阅读 · 0 评论 -
UVA 10911 Forming Quiz Teams
大意:最优配对问题,集合上的动态规划。思路:我做了好久,找一个BUG找了好久,似乎LYJ的白书有错误额,想睡觉了,还是要多理解才行啦。#include #include #include #include #include #include #include using namespace std;const int MAXN = 1<<21;const int INF原创 2013-01-19 23:50:46 · 1194 阅读 · 0 评论 -
UVA 10717 Mint
大意:给定不同厚度的硬币n 选出其中的四个,然后组成四个桌腿并且要使每个桌腿高度一样! 给定的高度h, 分别求不大于h的最大的高度和不小于h的最小高度。思路:真心写了好久,脑袋有晕了。。。一开始题目意思弄错,以为只有4个桌脚,后来发现有n个。最小接近,即模lcm余数最小:min(q%lcm);最大接近,即(q+x)%lcm == 0,x = lcm-q%lcm;#include原创 2013-01-20 15:26:00 · 671 阅读 · 0 评论 -
UVA 10564 Paths through the Hourglass
大意:有一个沙漏,从第一行开始走,每次往下走一行,往左或者往右走一列,不能走出沙漏。你的目标是让沿途经过的所有整数之和恰好为一个给定的整数。求出符合条件的路径条数。思路:求路径条数,这很常见,令d[i][j][s]表示以第i行,j列的元素为起点,累加的和为s的路径条数,从上往下走,只要走到终点,则令终点的值为1,这样在搜索时就可以很方便的求出结果。这一题还有一个问题不好解决,如果只有上三角原创 2013-01-19 17:59:59 · 746 阅读 · 0 评论 -
UVA 571 Jugs
大意不再赘述。思路:这道题写了好久额。说是说数学题,但我用隐式图的遍历过了。开两个数组,fa记录前驱,f记录当前操作,然后模拟即可。还有一个BUG,操作的时候,最好把cur.v[0],cur.v[1]分别赋给两个变量ca,cb,要不然会导致结果出错而且不容易查错。#include #include #include #include #include #include原创 2013-01-15 18:07:45 · 878 阅读 · 0 评论 -
UVA 10516 Another Counting Problem
大意略。思路:组合数学神马的,最难思考了。我想这道题的结论可以记下来,即:满K叉树的前i层的不同的树的数量为:f[i-1]^K + 1参考了这篇博客:解法#include #include #include #include #include #include #include using namespace std;const int MAXN = 10原创 2013-01-29 23:56:45 · 672 阅读 · 0 评论 -
UVA 106 Fermat vs. Pythagoras
大意:给定一个整数N,求N范围内(x,y,z 思路:本原毕达哥拉斯方程组满足:x = m^2 - n^2;y = 2*m*n;z = m^2 + n^2;其中m > n,且m,n奇偶性不同。在此题中,要求所给范围内的毕达哥拉斯三元组,只需对m,n进行枚举即可,然后将三元组乘以i(保证i*z在所给的范围之内),就可以求出所有的毕达哥拉斯三元组。#include #i原创 2013-01-12 17:36:55 · 683 阅读 · 0 评论 -
UVA 10201 Adventures in Moving - Part IV
大意不再赘述。思路:d[i][j]表示到第i个加油站时,车厢内剩余油量为j时的最小消耗。从i-1站到i站,要满足j+A[i].dis-A[j].dis = 100+de-A[n].dis即可。#include #include #include #include using namespace std;const int MAXN = 110; const int I原创 2013-01-14 09:41:34 · 760 阅读 · 0 评论 -
UVA 10079 Pizza Cutting
大意略。思路:切豆腐,3刀八块,关键是如何去切。f[n]-f[n-1] = n,f[0] = 1;#include #include #include #include #include #include using namespace std;typedef long long LL;LL n;int main(){ while(~scanf("%lld",原创 2013-01-28 21:10:41 · 726 阅读 · 0 评论 -
UVA 10673 Play with Floor and Ceil
一开始看不懂那数学符号,以为是大括号,尼玛,后来发现是想下取整和向上取整。思路:用扩展欧几里得解得一个解,注意floor的是否要转换为double,不然会WA。#include #include #include #include #include #include using namespace std;typedef long LL;void ex_gcd(LL a原创 2013-01-12 12:35:24 · 742 阅读 · 0 评论 -
UVA 10617 Again Palindrome
大意不再赘述。思路:有了上一道回文串的题为基础,这一道题便很好思考了。由于只有删除操作,比较方便,所以我们用d[i][j]表示区间i~j内回文串的个数,初始化d[i][i] = 1,因为单个字符一定是回文串,而我们开始时,则需要从两个端点开始推。基于删除操作的转移方程:d[i][j] = d[i+1][j] + d[i][j-1] + 1;(str[i] == str[j]) ①d原创 2013-01-14 21:57:56 · 1220 阅读 · 1 评论 -
UVA 10023 Square root
大意:大数平方根,用得不多。原创 2013-01-14 23:11:37 · 850 阅读 · 0 评论 -
UVA 10806 Dijkstra, Dijkstra.
大意:从起点走到终点,然后从终点走到起点,其中不能同时走过相同的一条边,问你最小路径长度。思路:把无向边拆边,起点到终点求一次最短路径,将最短路径经过的边记录下来,然后把最短路径上的边不同的删除,相同的取相反数(第二次最短路径以终点为原来的起点),然后再做一次最短路径,这样,就可以保证两次的总长度是最短的。不能求一次最短路径,然后把经过的最短路径删除,这样的做法求得的不一定是最优的,具体应原创 2013-01-29 17:39:01 · 1273 阅读 · 0 评论 -
UVA 10183 How Many Fibs?
大意不再赘述。思路:直接用高精度算出1~1000的fibonacci数,然后判断是否在范围内即可。#include #include #include #include #include #include #include using namespace std;const int MAXN = 110;struct bign{ int s[MAXN], len;原创 2013-01-15 21:31:02 · 614 阅读 · 0 评论 -
UVA 10820 Send a Table
大意不再赘述。思路:很明显,找1~N范围内互素的个数,画一个直角坐标系,然后发现1~N内互素的个数为phi[n]*2,其中(1,1)的重复,-1即可。ans = phi[n]*2 - 1;#include #include #include #include #include #include #include using namespace std;const in原创 2013-01-15 22:38:12 · 839 阅读 · 0 评论 -
UVA 10128 Queue
大意略。思路:没有思路,特别是许多情况很难想清楚,于是参考了网上的资料。#include #include #include #include #include using namespace std;typedef long long LL;LL d[14][14][14];int N, P, R;void init(){ memset(d, 0, size原创 2013-02-05 14:45:00 · 908 阅读 · 0 评论 -
UVA 10519 !! Really Strange !!
大意:n个圆,两两相交于两点,把平面分成多少个区域。思路:中学递推题,设已有n-1个圆,第n个圆与前n-1个圆形成2(n-1)交点,即多出2*(n-1)条弧,一条弧把平面分成2*(n-1)个平面。所以:f(n) = f(n-1) + 2*(n-1),然后根据f(2) - f(1) = 2; f(3) - f(2) = 4; f(n) - f(n-1) = 2*(n-1)可推出,f(n) =原创 2013-01-20 23:48:30 · 719 阅读 · 0 评论 -
UVA 10817 Headmaster's Headache
大意略。思路:类似于0/1背包,每个人选或者不选,然后比较最后的结果即可。原创 2013-02-15 22:11:07 · 710 阅读 · 0 评论 -
UVA 10918 Tri Tiling
大意略。思路:很明显,奇数无解,考虑偶数。#include #include #include #include #include #include using namespace std;int f[35], g[35];int n;void init(){ f[0] = 1, f[1] = 0; g[0] = 0, g[1] = 1; for(int i原创 2013-02-15 23:10:23 · 774 阅读 · 0 评论 -
UVA 11069 A Graph Problem
大意略。思路:记忆化搜索即可。#include #include #include #include #include using namespace std;int d[78];int n;bool vis[78];int dp(int i){ int &ans = d[i]; if(vis[i]) return ans; vis[i] = 1; if(i原创 2013-02-17 12:05:47 · 731 阅读 · 0 评论 -
UVA 11081 Strings
大意略。思路:这个DP说实话真的很难思考,根本无从下手的感觉,参考了该论文#include #include #include #include #include using namespace std;const int MAXN = 72;int f[MAXN][MAXN][MAXN], f1[MAXN][MAXN][MAXN], f2[MAXN][MAXN][M原创 2013-02-18 10:35:30 · 1271 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort
大意:将无序的序列通过两两交换最少需要几次才能有序。思路:可以证明即数列的逆序对数,于是归并排序求解。#include #include #include #include #include using namespace std;const int MAXN = 500010;int n;typedef long long LL;LL A[MAXN], T[MA原创 2013-02-18 14:50:08 · 674 阅读 · 0 评论 -
UVA 10129 Play on Words
大意略。思路:有向图的欧拉路径。条件:1、连通2、有2个奇点,其中出度比入度一个大1,起点,另一个小1,终点。#include #include #include #include #include #include using namespace std;const int maxn = 50;int ind[maxn], outd[maxn];int原创 2013-03-16 22:27:38 · 1707 阅读 · 0 评论 -
UVA 10596 Morning Walk
大意略。思路:无向图的欧拉回路。条件:1、连通图 2、所有点的度为偶数。还有需要注意的地方。这组测试数据:3 20 11 0我测试了一下,可以输出Possible也可以输出Not Possible都可以过。如果孤立的点不算一个连通分量的话,那么则输出Possible,如果算的话,则输出Not Possible,两者均可。我的代码把它们单独看做一个连通分量。原创 2013-03-17 11:15:26 · 1033 阅读 · 0 评论 -
UVA 10054 The Necklace
大意略。思路:无向图的欧拉回路,其中有重复的数据,先判连通,然后判是否有奇数度的点,然后输出欧拉回路,函数有了小变化。void euler(int u) //有重复数据{ for(int v = 1; v <= maxn; v++) if(G[u][v]) { --G[u][v], --G[v][u]; euler(v); printf("%d %d\n", v, u);原创 2013-03-19 16:25:18 · 1101 阅读 · 0 评论 -
UVA 10735 Euler Circuit
大意 混合图中找欧拉回路思路 混合图中判断是否存在欧拉回路的方法都是一样,只是如何去找欧拉回路的问题。如何去找欧拉回路,满流后,如果图中已给出的无向边(e.cap > 0)有流流过,则把该边反向,如果没有,则不改,然后用套圈算法去找欧拉回路。/*UVA 10735*/#include #include #include #include #include #in原创 2013-08-09 17:39:21 · 1525 阅读 · 0 评论 -
UVA 10570 Meeting with Aliens
大意:N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列。思路:不管结果如何,我们可以假设最终的序列是以某个外星人为起点的有序序列,既然如此,我们可以构造另一个序列,把原来的外星人长度增加一倍,这样一来,原序列一定是这个构造序列的子序列。然后通过枚举,可以把最小交换次数求出来。继而解决下一个问题:如何求最小的交换次数?我们可以把1与1原创 2013-02-15 21:45:31 · 2024 阅读 · 0 评论 -
UVA 10599 Robots(II)
大意略。思路:转换为最长上升序列来做,用一个数组记录最长上升序列,另一个数组记录路径条数,但要保证最长上升序列最长的情况下,再记录路径条数。代码略。原创 2013-02-15 17:05:11 · 897 阅读 · 0 评论 -
UVA 10912 Simple Minded Hashing
大意:给定一个字符长度及权值,让你求组成该权值的字符的全部排列,字符串严格遵循上升序列。思路:设d[i][j][s]表示当前字符为i时,剩余长度为j,组成的权值为s的可能情况,由于遵循严格的上升序列,事实上,初始化只需写一遍即可。因为设长度为L’的集合为S‘,长度为L的集合为L,若L' 记忆化搜索时,注意边界条件,每次都是在这里纠结,WA。#include #include #原创 2013-01-21 00:10:45 · 750 阅读 · 0 评论 -
UVA 11258 String Partition
大意不再赘述。思路:给定一个字符串序列,让d[i]表示前i个字符切割时的最小值,则d[i] = min(d[i], d[i-j]+num),num表示从后往前划分为j长度的数字,这样,就满足了递推的关系。#include #include #include #include #include #include #include using namespace std;原创 2013-01-21 11:10:42 · 1003 阅读 · 0 评论 -
UVA 662 Fast Food
大意略。有些地方参考了别人的博客。思路:区间DP,一开始根本就没有思路,想了很久,很多方面木有想清楚啊,后来发现DP方程可以这样表示:dis[i][j]可以表示在餐馆i~j建立仓库的最小距离,最小距离便是在(i+j)/2建立餐馆,这个可以证明的。d[i][j] = min(d[i][j], d[i-1][k] + dis[k+1][j]);d[i][j]表示从前j个餐馆内建立i原创 2013-02-08 17:04:40 · 671 阅读 · 0 评论 -
UVA 662 Fast Food
大意略。有些地方参考了别人的博客。思路:区间DP,一开始根本就没有思路,想了很久,很多方面木有想清楚啊,后来发现DP方程可以这样表示:dis[i][j]可以表示在餐馆i~j建立仓库的最小距离,最小距离便是在(i+j)/2建立餐馆,这个可以证明的。d[i][j] = min(d[i][j], d[i-1][k] + dis[k+1][j]);d[i][j]表示从前j个餐馆内建立i原创 2013-02-06 18:51:23 · 624 阅读 · 0 评论 -
UVA 10081 Tight Words
大意略。思路:长度从一开始统计共有多少种情况,然后除以排列总数即可,必须用double存,long long 与 unsigned long long 都会爆。#include #include #include #include #include #include #include using namespace std;typedef unsigned long lo原创 2013-02-08 20:40:25 · 693 阅读 · 0 评论 -
UVA 10723 Cyborg Genes
大意略。思路:参考了网上的资料,自己漏掉了一种情况。#include #include #include #include #include #include using namespace std;const int MAXN = 40;int d1[MAXN][MAXN];int d2[MAXN][MAXN];char str1[MAXN], str2[MAX原创 2013-02-06 18:20:03 · 630 阅读 · 0 评论