随笔分类 -  UVA

1 2 3 下一页
UVA 10313 - Pay the Price
摘要:理解了别人的代码,找好状态,以后再做一遍。。#include<stdio.h>#include<string.h>#define MAXN 310char b[100];int N, L1, L2;long long int f[MAXN][MAXN];void prepare(){ int i, j; N = 300; memset(f, 0, sizeof(f)); f[0][0] = 1; for(i = 0; i <= N; i ++) for(j = 1; j <= N; j ++) { if(i - j... 阅读全文
posted @ 2012-07-31 13:39 BFP 阅读(227) 评论(0) 推荐(0)
UVA 10599 - Robots(II)
摘要:又是一道做的不成熟的题:怎么改呢。。。明天想想。。。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 10000+100int num, n, m, g, e;int x[MAXN], y[MAXN], f[MAXN], flag[MAXN], p[MAXN], r[MAXN];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q; if(x[*p] == x[*q]) r 阅读全文
posted @ 2012-07-30 20:57 BFP 阅读(246) 评论(0) 推荐(0)
UVA 11258 - String Partition
摘要:注意用long long就可以了#include<stdio.h>#include<string.h>#define INF 0x7fffffffchar s[210];int n;long long f[210];void solve(){ memset(f,0,sizeof(f)); int len = strlen(s); for(int i = 0; i < len; i ++) { if(s[i] == '0') { if(f[i] > f[i+1]) f[i+1] = f[i];... 阅读全文
posted @ 2012-07-30 10:43 BFP 阅读(298) 评论(0) 推荐(0)
UVA 10635 - Prince and Princess
摘要:题不是很难,但不知道怎么。。。请教下面两个代码有什么不同吗?为什么一个可以A,一个却是WA。AC:#include<stdio.h>#include<string.h>#define MAXD 70000int N, P, Q, s[MAXD], r[MAXD];void solve(){ int i, j, p, q, top, mid, max, min; scanf("%d%d%d", &N, &P, &Q); memset(r, 0, sizeof(r)); for(i = 1; i <= P+1; i ++) 阅读全文
posted @ 2012-07-29 22:00 BFP 阅读(206) 评论(0) 推荐(0)
UVA 11151 - Longest Palindrome
摘要:尽管很容易,还是贴出来吧。#include<stdio.h>#include<string.h>int n, f[1000][1000], len;char s[1010];void solve(){ memset(f,0,sizeof(f)); for(int i = 0; i < len; i ++) f[i][i] = 1; for(int k = 1; k < len; k ++) { for(int i = 0; i+k < len; i ++) { if(s[i] == s[i+k]) f[i][i+... 阅读全文
posted @ 2012-07-29 19:47 BFP 阅读(187) 评论(0) 推荐(0)
UVA 10154 - Weights and Measures
摘要:这道题隔了一个才做,动归有些生疏了,但从新捡起来发现比以前理解的更透彻了。f[i]表示托i个乌龟时的最轻重量,不断的去更新重量使其最小。这里要先做好预处理, 也就是为最长子序列拍好序。但是按照什么顺序排序呢?这里要用到一点贪心,我们想如果现在有两个乌龟,一个力气大一个力气小,重力我们不用管,那么应该把力气大的乌龟放在下面,还是力气小的呢,你可能会想,这和重力有关啊,仔细分析,如果力量大的在下面,力量小的在上面,那么力量大的还能承受的重力就是s[da]-w[xiao]-w[da],力量小的能够承受的重力为s[xiao],前者可能大于,等于,或小于后者;如果力量小的在下面,力量大的在上面,那么力量 阅读全文
posted @ 2012-07-21 15:42 BFP 阅读(256) 评论(0) 推荐(0)
UVA 10369 - Arctic Network
摘要:最小生成树问题,kruskal算法的变形。代码如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#define MAXN1 500+10#define MAXN 3000000int z, n, s, m, x[MAXN1], y[MAXN1], u[MAXN], v[MAXN], p[MAXN1], r[MAXN];double w[MAXN], flag[MAXN];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int * 阅读全文
posted @ 2012-06-13 20:20 BFP 阅读(166) 评论(0) 推荐(0)
UVA 10397 - Connect the Campus
摘要:最小生成树问题,注意消去固定边时的方法:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define MAXN 800#define MAXN1 300000double x[MAXN], y[MAXN], w[MAXN1];int n, p1, m, p[MAXN], u[MAXN1], v[MAXN1], r[MAXN1], vis[1010][1010];int cmp(const void *_i, const void *_j){ int *i 阅读全文
posted @ 2012-05-23 23:13 BFP 阅读(155) 评论(0) 推荐(0)
UVA 10048 - Audiophobia
摘要:floyd算法的变形,输出格式问题要注意。。。代码如下:#include<stdio.h>#define MAXNC 100 + 10#define INF 100000 + 100int d[MAXNC][MAXNC];int C, S, Q, num;void init(){ num = 0; while(scanf("%d%d%d",&C, &S, &Q)) { if(C <= 1) break; else if(num != 0) printf("\n"); for(int i = 0; i <= 阅读全文
posted @ 2012-05-23 20:58 BFP 阅读(270) 评论(0) 推荐(0)
UVA 10034 - Freckles
摘要:利用并查集求最短路,注意浮点数,再就是需要准备一下边集。#include<stdio.h>#include<math.h>#include<stdlib.h>#define MAXN 5000 + 100#define MAXN1 100 + 10int n, m, p1, p[MAXN1],r[MAXN],u[MAXN],v[MAXN];double w[MAXN], x[MAXN1], y[MAXN1];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int * 阅读全文
posted @ 2012-05-17 23:54 BFP 阅读(182) 评论(0) 推荐(0)
UVA 567 - Risk
摘要:最短路问题:floyd算法:注意:输出格式#include<stdio.h>#define MAXN 200int a, b, n, d[30][30], num;void init(){ num = 0; while(scanf("%d",&a) == 1) { for(int i = 1; i <= 20; i ++) for(int j = 1; j <= 20; j ++) if(i == j) d[i][j] = 0; else d[i][j] = MAXN; ... 阅读全文
posted @ 2012-05-16 00:27 BFP 阅读(178) 评论(0) 推荐(0)
UVA 11137 - Ingenuous Cubrency
摘要:这道题想错了方向,一直纠结于背包运行过程中忽略了一些情况,比如:要选8这个物品,当体积是8的时候我选了一个,因为存在价值为1这样的物品,这就是一种情况,但是当容量是16的时候,因为是完全背包,我又要选一个8,也就是覆盖了前面的f[8],因此我怎样去记录最终组合的种数呢?比如我给的容量就是16:那么会有两种情况8×1+1×8,2×8;但实现起来却是很不容易;换个思路:我们设f[i]表示组成i面值的种数,则f[j] = f[j] + f[j-w[i]];相当于如果当前值j>w[i]的话,我们就选这个面值,因为有面值一的存在,必成立,又多了f[j-w[i]]种情况 阅读全文
posted @ 2012-05-07 19:51 BFP 阅读(291) 评论(0) 推荐(0)
UVA 11081 - Strings
摘要:参考了:http://par.cse.nsysu.edu.tw/~advprog/advprog2008/11081.doc。里面有一点不对,但思路是对的。字符串问题,题意是让我们在前两个字符串里抽取某些字符,组合为第三个字符串,当然必修要考虑到空集的存在,看到这个问题,我们用dp的思路将它分解,例如:给三个长度为len1,len2,len3的字符串,那么我们可不可以先求出长度为a,b,c,其中a<len1,b<len2,c<len3.由此原问题可以分解为子问题。那么当长度为a,b,c时如何推出len1,len2,len3这个组合呢?i,j,k为三个串的的那个前位置,首先我们 阅读全文
posted @ 2012-05-04 20:34 BFP 阅读(685) 评论(0) 推荐(0)
UVA 10617 - Again Palindrome
摘要:这道题因为那个score out给我蒙住了,其实说白了,就是给你一串字符串,让你从中找出有多少回文字串,这个回文字串可以是一个字母,也可以是多个。既然是动态规划题:我们肯定要这样想,让我们求长度为len的字符串有多少回文字串,那么长度为len-1的字符串有多少回文子串呢,如果我们求出了len-1的字符串,那么长度为len的字符串的回文字串的个数可不可以通过这个来求出呢,那么长度为len-1的母串可不可以通过len-2的母串求出呢,。。。。。当然上面的过程当然是可以的:接下来想一个串如果两端不等的话(ABBO):那么它的方式就等于 1 + ABB里面的种数 + BBO里面的种数 – 两个集合重复 阅读全文
posted @ 2012-04-26 22:37 BFP 阅读(563) 评论(0) 推荐(0)
UVA 10271 - Chopsticks
摘要:大意:在中国,众通常用一双筷子吃饭。但是L先生与众不同:他用三支筷子吃饭。其中的一支长筷子用来叉取大块的食物,而剩下两支用作普通筷子。两支普通筷子的长度应尽可能的接近,而长的那支只要是三支中最长的就可以了。对于一幅筷子的长度A,B,C(A≤B≤C),定义函数(A-B)2为这副筷子的“难用度”。L先生邀请K个人参加他的生日聚会,并且想将他用筷子的方法介绍给其他人。他需要准备K+8副这样的筷子(给他自己、妻子、儿子、女儿、父亲、母亲、岳父、岳母以及K名客人)。但是L先生的筷子有很多不同的长度!给出所有筷子的长度,他需要找到一种组合K+8副筷子的方法,使得难用度的总和最小。这道题我们先降序排序,然后 阅读全文
posted @ 2012-04-25 00:13 BFP 阅读(337) 评论(0) 推荐(0)
UVA 10304 - Optimal Binary Search Tree
摘要:这道题以二叉搜索树为背景,有点像最优矩阵链乘的问题:设f[i][j] 表示元素i到元素j的最优解,设k为i到j元素所形成二叉树的根,则有f[i][j] = min{f[i][k-1]+f[k+1][j]+sum[i][j]-a[k]},这里sum[i][j]为i到j的查找频率之和,a[k]为root的查找频率,因此我们要求所有元素的前缀和,为什么要加sum[i][j]-a[k];因为我们每加一层,相当于加了sum[i][j]-a[k];代码如下;#include<stdio.h>#include<string.h>#define MAXN 260#define INF 阅读全文
posted @ 2012-04-23 14:29 BFP 阅读(394) 评论(0) 推荐(0)
UVA 10739 - String to Palindrome
摘要:由于添加字母和删除字母的效果是一样的,因此我们这里就只进行删除和替换操作。用f【i】【j】表示将第i到j之间的字串变成回文串的最小操作步数,然后转移方程为当s【i】!=s【j】时,f【i】【j】 = min( f【i+1】【j】 ,f【i】【j-1】,f【i+1】【j-1】)+1;当相等时f【i】【j】 =f【i+1】【j-1】;递归操作更方便;#include<stdio.h>#include<string.h>#define MAXN 1010#define INF 0x7fffffffchar s[MAXN];int n, f[MAXN][MAXN];int dp 阅读全文
posted @ 2012-04-18 22:16 BFP 阅读(222) 评论(0) 推荐(0)
UVA 10306 - e-Coins
摘要:这道题考察的是这样的一个问题,在m行的第一列中找一些数,计算它们之和的平方,然后再计算对应的第二列中的那些数的和的平方,这两个数之和为s2就可以了。这里我借鉴了二维费用的背包问题,易于理解,速度还可以。代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 45int n, m, s;int a[MAXN][2], f[310][310], x[310], y[310];void solve(){ int p = 0; int min = 0x7fffffff; for(i 阅读全文
posted @ 2012-04-18 15:48 BFP 阅读(326) 评论(0) 推荐(0)
UVA 590 - Always on the run
摘要:第一次把题意理解错了,第二次因为一个 ] ,wrong了四次,还好在极值样例的检测下,找出来了。以后打代码一定要注意了。我是这样定义状态的,f[i][j]表示在第i天时,在城市j所花费的最小费用,很简单的dp题:代码如下:#include<stdio.h>#include<string.h>#define INF 2000000000long long b[15][15][35];long long f[1010][15];int n, k, num;void output(){ if(f[k+1][n] < INF)printf("The best f 阅读全文
posted @ 2012-04-11 16:55 BFP 阅读(401) 评论(0) 推荐(0)
UVA 10651 - Pebble Solitaire
摘要:这道题是模仿别人的bfs,却也有所收获。把12个棋位的有无棋子整体看作一个状态,然后宽搜就可以了。代码如下:#include<stdio.h>#include<string.h>#define MAXN 11000char b[20];int q[MAXN], hash[MAXN], d[MAXN];int N, n;void solve(){ int x,i; int front = 0, rear = 0; memset(hash,0,sizeof(hash)); hash[q[rear]] = 1; d[rear] = 0; rear ++; w... 阅读全文
posted @ 2012-04-06 20:50 BFP 阅读(319) 评论(0) 推荐(0)

1 2 3 下一页