上一页 1 ··· 62 63 64 65 66 67 68 69 70 ··· 85 下一页
  2011年11月3日
摘要: 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) 编辑
  2011年11月2日
摘要: UVA_10405 求最长公共子序列,为了防止字符串里有空格的情况,还是直接用gets读字符串更稳妥些。#include<stdio.h>#include<string.h>#define MAXD 1010char a[MAXD], b[MAXD];int f[MAXD][MAXD];int init(){ if(gets(&a[1]) == NULL) return 0; gets(&b[1]); return 1;}void solve(){ int i, j, k1, k2; k1 = strlen(&a[1]); k2 = strle. 阅读全文
posted @ 2011-11-02 23:57 Staginner 阅读(268) 评论(0) 推荐(0) 编辑
摘要: UVA_103 首先我们应该对坐标内部排序,之后一个直观的想法就是扫描一遍所有盒子,如果i可以放到j内,就连一条i->j的有向边,然后求dfs树形图的最深层数即可。 另外,我们也可以对盒子按第一个坐标进行排序,然后去求最长上升子序列。#include<stdio.h>#include<string.h>#include<stdlib.h>int N, K, G[40][40], a[40][20], indgr[40], outdgr[40], path[40], max;int cmp(const void *_p, const void *_q){ 阅读全文
posted @ 2011-11-02 21:13 Staginner 阅读(260) 评论(0) 推荐(0) 编辑
摘要: UVA_111 这个题目并不困难,但是题意理解起来很蛋疼。 题目的意思是求两个事件序列的最长公共子序列,而题目中输入的是每个事件发生的时间,因而要先根据每个事件发生的时间把事件的序列的找到。 比如如果输入是1 3 4 2,那么实际上事件序列是1 4 2 3。#include<stdio.h>#include<string.h>#define MAXD 30int N, a[MAXD], b[MAXD], f[MAXD][MAXD];int init(){ int i, k; for(i = 1; i <= N; i ++) { if(scanf("%d& 阅读全文
posted @ 2011-11-02 20:06 Staginner 阅读(406) 评论(0) 推荐(0) 编辑
摘要: HDU_4081 这个题目大体的思路是这个样子的,首先求一个最小生成树,然后求出或者顺便求出最小生成树上任意两点间路径上的最大边权,之后枚举magic road,把magic road两个端点间的之前记录的最大边边权减去后作为B,把magic road两个端点上的人口和作为A,更新一下A/B即可。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXD 1010#define MAXM 1000010int N, x[MAXD], y[MAX 阅读全文
posted @ 2011-11-02 02:37 Staginner 阅读(754) 评论(0) 推荐(0) 编辑
上一页 1 ··· 62 63 64 65 66 67 68 69 70 ··· 85 下一页