上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页
  2012年3月23日
摘要: 这道题改天重新做一下:高人的代码:#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 1010char b[10010];int N, M, G[MAXD][MAXD], f[MAXD][MAXD];void solve(){ int i, j, k; gets(b); sscanf(b, "%d%d", &N, &M); memset(G, 0, sizeof(G)); for(i = 1; i <= N; i ++) { gets(b) 阅读全文
posted @ 2012-03-23 21:12 BFP 阅读(597) 评论(0) 推荐(0) 编辑
  2012年3月22日
摘要: 读了几遍题,还不知道题的意思,唉,理解能力啊,看了别人的代码之后,奥,原来是这样,这里简单说一下对题目的理解,它说我们有这样一个细胞链,其中细胞只有A和B两种,给你这个细胞链让你看一下,是不是经过所给的三种状态,可以变化成现在的状态,然后输出现在处于什么状态。的确像个DPS。代码如下:#include<stdio.h>#include<string.h>#define MAXN 100100int n, stage;char c[MAXN];char t[4][20] = {"SIMPLE","FULLY-GROWN"," 阅读全文
posted @ 2012-03-22 21:55 BFP 阅读(409) 评论(0) 推荐(1) 编辑
摘要: 动规的题,还是尽量转化成动规的形式,用一个数组f[i]表示当还有i个石子该Stan取的时候,Stan是否能够获胜。代码:#include<stdio.h>#include<string.h>#define MAXD 1000010#define MAXM 15int N, M, f[MAXD], r[MAXM];void init(){ int i; scanf("%d", &M); for(i = 0; i < M; i ++) scanf("%d", &r[i]);}void solve(){ int i 阅读全文
posted @ 2012-03-22 12:09 BFP 阅读(265) 评论(0) 推荐(0) 编辑
  2012年3月21日
摘要: 是一道归根于最长上升子序列的问题,权值1改为高度h,因为要求最大上升子序列,要先排序,这里按面积升序排序,使后面的面积大的block不会叠在前面面积小的block之上,便于递推,这里用qsort排序方便很多。代码如下:#include<stdio.h>#include<stdlib.h>#include<string.h>int n, x[95], y[95], h[95], f[95], r[95];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q 阅读全文
posted @ 2012-03-21 22:41 BFP 阅读(513) 评论(0) 推荐(0) 编辑
  2012年3月20日
摘要: 这是一道动态规划的dps问题,注意深搜的过程中做到记忆化搜索。代码如下:#include<stdio.h>#include<string.h>int n, R, C, max, a[105][105], f[105][105];char name[100];int dp(int i, int j){ if(f[i][j] != 0) return f[i][j]; if(i<=R&&i>=1&&j<=C&&j>=1) { int k, p, q; if(a[i][j] > a[i-1][j]) 阅读全文
posted @ 2012-03-20 23:44 BFP 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 完全背包问题,背包九讲细看一下,还有一点灵活的运用:打印剩余时间那块。代码如下:#include<string.h>#include<stdio.h>#define MAXN 10010int a[3], t, f[MAXN];void solve(){ int n = 0; memset(f, 0 , sizeof(f)); f[0] = 1; for(int i = 1; i < 3; i ++) { for(int j = a[i]; j <= t; j ++) { if(f[j] < f[j - a[i]]... 阅读全文
posted @ 2012-03-20 17:49 BFP 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 最长公共子序列问题,打印路径总结了两个方法,一个是递归指向,就像前面做的01背包问题如:for(int i = 1; i < n; i ++) for(int j = 0; j < n-i; j ++) for(int k = j; k < i+j; k ++) { if(k == j) { f[j][i+j] = f[j][k]+f[k+1][i+j]+A[j][0]*A[k][1]*A[i+j][1]; ... 阅读全文
posted @ 2012-03-20 12:28 BFP 阅读(1203) 评论(0) 推荐(1) 编辑
  2012年3月19日
摘要: 这道题开始我以为是将全家人所能携带重量的总和加起来,作为新的背包的容量,但样例过不了,后仔细一读题,原来是以每人为一个背包,最后计算各背包的总和。也就是多人的01背包问题。代码如下:#include<stdio.h>#include<string.h>#define MAXN 1000+10int T, N, G, sum;int p[MAXN], w[MAXN], mw[110], f[MAXN][35];void solve(){ memset(f, 0, sizeof(f)); sum = 0; for(int k = 1; k <= G; k ++) { 阅读全文
posted @ 2012-03-19 22:08 BFP 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 这道背包题很基础,要学习一下dp输出,。代码如下:#include<stdio.h>#include<string.h>#define MAXN 10000int tap, cdnum, num[25],f[25][MAXN],p[25][MAXN];void print(int i, int j){ if(i == 0) return; print(i - 1, p[i][j]); if(p[i][j] < j) printf("%d ", num[i]);}void solve(){ memset(p,0,sizeof(p)); m... 阅读全文
posted @ 2012-03-19 00:00 BFP 阅读(240) 评论(0) 推荐(0) 编辑
  2012年3月17日
摘要: 这道题的输出路径是个问题,仔细体会。代码:#include<stdio.h>#include<string.h>#define MAXN 10 + 5int A[MAXN][2], f[MAXN][MAXN],part1[MAXN][MAXN];int n;void printpath(int a, int b){ if(a == b) { printf("A%d", a + 1); return ; } printf("("); printpath(a, part1[a][b]); printf(" x ") 阅读全文
posted @ 2012-03-17 21:42 BFP 阅读(278) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页