2011年11月3日
摘要: UVA_147 用dp进行计数即可,状态转移方程为f[i][j]=Sum{f[i][j-k*a[i]]}(j-k*a[i]>=0,k为整数),其中i代表第i种面值,j代表当前有j的cents,a[i]为第i种面值的大小。在递推的时候,需要从小的面值向大的面值进行递推。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 6010int d[] = {1, 2, 4, 10, 20, 40, 100, 200, 400, 1000, 2000};long long int f[12 阅读全文
posted @ 2011-11-03 22:30 Staginner 阅读(294) 评论(0) 推荐(0) 编辑
摘要: UVA_10192 求最长公共子序列即可。#include<stdio.h>#include<string.h>#define MAXD 110char b1[MAXD], b2[MAXD], f[MAXD][MAXD];int init(){ gets(b1 + 1); if(b1[1] == '#') return 0; gets(b2 + 1);}void solve(){ int i, j, k1, k2; memset(f, 0, sizeof(f)); k1 = strlen(b1 + 1); k2 = strlen(b2 +... 阅读全文
posted @ 2011-11-03 21:51 Staginner 阅读(190) 评论(0) 推荐(0) 编辑
摘要: UVA_10066 求最长公共子序列即可。#include<stdio.h>#include<string.h>#define MAXD 110int N1, N2, a1[MAXD], a2[MAXD], f[MAXD][MAXD];int init(){ int i; scanf("%d%d", &N1, &N2); if(!N1 && !N2) return 0; for(i = 1; i <= N1; i ++) scanf("%d", &a1[i]); for(i = 1; 阅读全文
posted @ 2011-11-03 20:51 Staginner 阅读(275) 评论(0) 推荐(0) 编辑
摘要: UVA_10131 这个题目首先可以把大象按体重升序排列,然后求一个IQ的最长下降子序列即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 1010int N, w[MAXD], q[MAXD], f[MAXD], r[MAXD], p[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q; return w[*p] - w[*q];}void printr 阅读全文
posted @ 2011-11-03 20:39 Staginner 阅读(341) 评论(0) 推荐(0) 编辑
摘要: UVA_116 这个题目可以用记忆化搜索实现,由于矩阵中的数字不全为正,故可以把INF作为还没有搜索过的标记。由于要求字典序最小,所以分情况控制好搜索顺序即可。#include<stdio.h>#include<string.h>#define INF 1000000000int R, C, a[20][110], f[20][110], next[2200];void init(){ int i, j; for(i = 0; i < R; i ++) for(j = 0; j < C; j ++) scanf("%d", &a[ 阅读全文
posted @ 2011-11-03 20:09 Staginner 阅读(460) 评论(0) 推荐(0) 编辑
摘要: UVA_10003 这是个区间的动态规划问题,首先我们可以补两个端点,然后就按区间长度递增的顺序进行递推即可,区间长度为1时的花费要初始化成0,其余初始化为INF。 转移方程为f[i, j] = min{f[i, k] + f[k, j] + a[j] – a[i]}(i < k < j)。#include<stdio.h>#include<string.h>#define MAXD 60#define INF 100000000int a[MAXD], N, L, f[MAXD][MAXD];int init(){ int i, j; scanf(&quo 阅读全文
posted @ 2011-11-03 16:44 Staginner 阅读(383) 评论(0) 推荐(0) 编辑
摘要: UVA_674 这个题目可以用深搜去处理,枚举每个不为1的面值所选的数量即可,最后剩下的面值就必然都选1。为了充分利用子问题的解,我们可以在计算的过程中把所有子问题的解都保留下来,当计算其他结果需要用的时候,直接返回记录的值即可。#include<stdio.h>#include<string.h>#define MAXD 8000int f[MAXD][5], A[] = {50, 25, 10, 5, 1};int N;int dfs(int cur, int st){ int i, a = 0; if(f[cur][st]) return f[cur][st];. 阅读全文
posted @ 2011-11-03 01:45 Staginner 阅读(277) 评论(0) 推荐(0) 编辑