上一页 1 2 3 4 5 6 7 ··· 14 下一页
摘要: 数据不大,直接枚举……嗯,然后就是,比如:1212和1212接龙之后是121212,而不是12121212,就这个注意的,代码:#include <stdio.h>#include <string.h>#include <stdlib.h>char str[20][1001];char tmp[1001];int f[20][20];int used[20];int ans;int n;void srch(int k, int len){ int i; if(len > ans){ ans = len; } used[k]++; for(i = 0; 阅读全文
posted @ 2011-08-17 17:06 zqynux 阅读(1614) 评论(0) 推荐(0) 编辑
摘要: 可以如果题目有解的话(即,最后一排中没有没有水的城市。),那么第一排中的任意一个城市能够运水到达最后一行的城市是一个区间,是连续的!证明我不写了,我也不会,呵呵。以前看过一篇,然后知道这个信息之后,直接贪心就行了,看代码吧:#include <stdio.h>#include <string.h>#include <stdlib.h>int num[500][500];int can[500][500];int m, n;#define deal(i, j) if((((i) >= 0 && (i) < n && 阅读全文
posted @ 2011-08-16 19:00 zqynux 阅读(1967) 评论(0) 推荐(0) 编辑
摘要: 就是排序,唯一麻烦的就是确定先后顺序的函数,就是比较函数啦,嗯,看代码吧:#include <stdio.h>#include <string.h>#include <stdlib.h>char num[20][10001];char tmp[10001];int com(const void *a, const void *b){ char *i = (char *)a, *j = (char *)b; while(*i != '\0' && *i == *j){ i++, j++; } if(*i == '\0&# 阅读全文
posted @ 2011-08-16 15:05 zqynux 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 比较难做的DP吧,首先要预处理一个w[i][j],代表从i~j之间存在的单词个数,嗯。。 然后f[j][i] = max(f[l][i - 1] + w[l + 1][j]) (i<l<j) 代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>char str[202];char sub[6][201];int len[6];int d[201], w[201][201];int f[201][41];int main(int argc, char **argv){ int i 阅读全文
posted @ 2011-08-15 18:00 zqynux 阅读(1580) 评论(0) 推荐(0) 编辑
摘要: 这个题目刚开始因为就是枚举,后来数据太大,不能搜,就想到数学方法了,答案就是n/5+n/5^2+n/5^3,知道5^k > n,就不加了。 代码如下:#include <stdio.h>#include <stdlib.h>long long ans;int main(int argc, char **argv){ int i; long long j = 5; long long n; scanf("%I64d", &n); for(i = 1; j <= n; i++){ ans += n / j; j *= 5; } pri 阅读全文
posted @ 2011-08-14 23:03 zqynux 阅读(244) 评论(0) 推荐(0) 编辑
摘要: f[0][i][j]代表不走房子到达i, j的最短路径是多少,f[1][i][j]代表走房子到达i, j的最短路径是多少(并不一定是从i, j走房子)? 然后看我的代码吧,实在不好说……#include <stdio.h>#include <string.h>#include <stdlib.h>#define Q_MAX 100000#define deal(a, b) deal_((a), (b), x, y)int f[2][1000][1000];char map[1000][1000];struct dot{ int x, y;}queue[Q_M 阅读全文
posted @ 2011-08-14 22:52 zqynux 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 这题比较悲剧吧,始终只有80分,到最后才发现数组开销了一个1,应该是[101][51],我开的[101][50],然后。。。。80分咯~ 代码如下:#include <stdio.h>#include <stdlib.h>#define min(a, b) (((a)<(b))?(a):(b))int num[101];int f[101][51];int com(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(int argc, char **argv){ int i, 阅读全文
posted @ 2011-08-13 23:52 zqynux 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 就实现正向从1点出发SPFA,获得min[i],就是到达i点能最低购买到的价格,然后反向(将图反向),从n点开始SPFA,获得max[i],就是从i点到终点能够卖出的最大的价格,然后就是寻找差价最大的i,输出答案即可。#include <stdio.h>#include <stdlib.h>int num[100000];int map[1000000], next[1000000];int end;int head[100000];void add(int a, int b){ map[end] = b; next[end] = head[a]; head[a] = 阅读全文
posted @ 2011-08-13 23:50 zqynux 阅读(2507) 评论(0) 推荐(0) 编辑
摘要: 也不知是怎么,以前没看懂为什么要用二分图,现在就懂了,以后也许碰到类似的题目还会想到用二分图,因为当i<j<k,且num[i]<num[j]&&num[i]>num[k]的时候,肯定是不能将i和j放在同一个栈了(是放在同一个栈,不是同时在一个栈里面。) 嗯,上代码把:#include <stdio.h>#include <stdlib.h>int num[1000];int min[1000];int map[1000000], next[1000000];int end, head[1000];void add(int a, i 阅读全文
posted @ 2011-08-11 11:51 zqynux 阅读(1387) 评论(0) 推荐(1) 编辑
摘要: f[i][j]代表将第i束花插进第j个花屏所能获得的最大的分,方程是: f[i][j] = max(f[i - 1][k] + map[i][j]) (i -1=<k<j),代码如下:#include <stdio.h>#include <stdlib.h>int f[101][101];int map[101][101];int p[101][101];void output(int a, int b){ if(a == 1){ printf("%d", b); return; } output(a - 1, p[a][b]); pri 阅读全文
posted @ 2011-08-10 18:07 zqynux 阅读(249) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 14 下一页