摘要: 设f[i][j]是前i个水晶搭建成两座高度差值为j的较高的那座的高度,转移方程如下: 我用的不是f[i][j]=....,而是根据f[i][j]推出f[i+1][...],所以不好写方程,看代码吧:#include <stdio.h>#include <stdlib.h>int num[101];int f[101][200001];#define max(a, b) ((a)>(b)?(a):(b))int main(int argc, char **argv){ int i, j, sum = 0; int n; scanf("%d", & 阅读全文
posted @ 2011-08-06 16:45 zqynux 阅读(382) 评论(0) 推荐(0) 编辑
摘要: f[i][j]代表j个乘号, 前i位数的最大值, 转移方程式: f[i][j] = max{f[k][j - 1] + num[k + 1][i]} (1 <= k < i),num[i][j]代表第i位数到第j位数组成的数字是多少。 代码如下:#include <stdio.h>#include <stdlib.h>typedef unsigned long long bignum;bignum f[41][31];bignum num[41][41];char str[42];#define max(a, b) ((a)>(b)?(a):(b))i 阅读全文
posted @ 2011-08-06 15:30 zqynux 阅读(2667) 评论(0) 推荐(1) 编辑
摘要: DP:f[i] = f[j] + 1 (1<= j < i, 且j是i的前缀.) 代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>char str[2001][501];int f[2001];int ans = 0;int main(int argc, char **argv){ int i, j; int n; scanf("%d", &n); for(i = 1; i <= n; i++){ scanf("%s", 阅读全文
posted @ 2011-08-06 14:49 zqynux 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 别人都说直接输出一行中>=k的数目就可以了,但我觉得不保险。不过仔细一想,好像可以证明它是对的,但是我证明不好!所以我就直接写了一个记录性的搜索,代码如下:#include <stdio.h>#include <stdlib.h>int map[200][200];int n, k;int ans = 0;int count[200];int used[200];int search(int i){ int j, t = 0; if(count[i]){ return count[i] - 1; } if(used[i]){ return 1; } used[i] 阅读全文
posted @ 2011-08-06 11:09 zqynux 阅读(175) 评论(0) 推荐(0) 编辑