2011年11月5日
摘要: UVA_531 本质上还是一个求最长公共子序列的问题,只不过需要打印路径。#include<stdio.h>#include<string.h>#define MAXN 110#define MAXM 40char a[MAXN][MAXM], A, b[MAXN][MAXM], B;int f[MAXN][MAXN], p[MAXN][MAXN], flag;int init(){ int i; A = B = 1; for(;;) { if(scanf("%s", a[A]) != 1) return 0; if(a... 阅读全文
posted @ 2011-11-05 22:23 Staginner 阅读(385) 评论(0) 推荐(0) 编辑
摘要: UVA_10130 这个题目有好多背包,但由于物品是无限的,而每个人对任意一种物品只能取一个,所以本质上还是0-1背包问题。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXW 40int N, M, G, f[MAXW], p[MAXD], w[MAXD], d[MAXW];void init(){ int i, j; scanf("%d", &N); for(i = 0; i < N; i ++) scanf("%d%d", &p 阅读全文
posted @ 2011-11-05 21:09 Staginner 阅读(250) 评论(0) 推荐(0) 编辑
摘要: UVA_624 实际就是0-1背包的问题,把时间等效成体积和价值就可以了。需要注意的是总时间的那个维度要开大一点,10000就够用了。#include<stdio.h>#include<string.h>#define MAXN 30#define MAXD 10010int M, N, a[MAXN], p[MAXN][MAXD], f[MAXN][MAXD];void init(){ int i; scanf("%d", &N); for(i = 1; i <= N; i ++) scanf("%d", & 阅读全文
posted @ 2011-11-05 18:21 Staginner 阅读(434) 评论(0) 推荐(0) 编辑
摘要: UVA_348 这是个区间动态规划的题目,动态转移方程为f[i][j]=min{f[i][k]+f[k+1][j]+left[i]*right[k]*right[j]}。#include<stdio.h>#include<string.h>#define MAXD 20#define INF 1000000000int N, left[MAXD], right[MAXD], f[MAXD][MAXD], p[MAXD][MAXD];int init(){ int i; scanf("%d", &N); if(!N) return 0; for 阅读全文
posted @ 2011-11-05 18:14 Staginner 阅读(328) 评论(2) 推荐(1) 编辑
摘要: UVA_562 这个题目可以将coins的面值和体积等效,然后转化成0-1背包问题。 背包的体积为总面值的一半,然后求放置物品的最大价值即可,越接近总面值的一半,两个人得到的coins的面值差就会越小。#include<stdio.h>#include<string.h>int a[110], f[50010], N, M, m;void init(){ int i; M = 0; scanf("%d", &N); for(i = 0; i < N; i ++) { scanf("%d", &a[i]); M 阅读全文
posted @ 2011-11-05 18:08 Staginner 阅读(303) 评论(0) 推荐(0) 编辑
摘要: UVA_12295 首先我们可以把线的两边对折,这样就变成了半个矩阵,同时问题就转化成了从左上角到折线的位置的最短路径的条数有多少。 首先,我们可以用SPFA求单源最短路,这样起点到每个点的最短路就都有了。之后为了能够算出路径的条数,我们可以从起点开始,每次取栈中d[]的值最小的点出栈,然后按最短路径的走向向周围的点拓展,并将拓展成功的点入栈。 最后,统计折线上的最短路的最小值,并把所有符合要求的路径的条数相加即可。 这个题目用dij及优先级队列做会更简单、高效,等学完dij之后再回头做下这个题目。#include<stdio.h>#include<string.h># 阅读全文
posted @ 2011-11-05 18:04 Staginner 阅读(250) 评论(0) 推荐(0) 编辑