NOIP 2001 统计单词个数 解题报告
2011-08-15 18:00
302 查看
比较难做的DP吧,首先要预处理一个w[i][j],代表从i~j之间存在的单词个数,嗯。。
然后f[j][i] = max(f[l][i - 1] + w[l + 1][j]) (i<l<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, j, l; int n, m, k; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%s", &str[1 + 20 * i]); } n *= 20; scanf("%d", &m); for(i = 0; i < m; i++){ scanf("%s", sub[i]); len[i] = strlen(sub[i]); } for(i = 1; i <= n; i++){ for(j = 0; j < m; j++){ if(strncmp(&str[i], sub[j], len[j]) == 0 && (d[i] == 0 || d[i] > len[j])){ d[i] = len[j]; } } } for(i = 1; i <= n; i++){ for(j = i; j <= n; j++){ w[i][j] = w[i][j - 1]; for(l = i; l <= j; l++){ w[i][j] += d[l] == (j - l + 1) ? 1 : 0; } } } for(i = 1; i <= k; i++){ for(j = i; j <= n; j++){ for(l = i - 1; l < j; l++){ if(f[j][i] < f[l][i - 1] + w[l + 1][j]){ f[j][i] = f[l][i - 1] + w[l + 1][j]; } } } } printf("%d\n", f [k]); return 0; }
相关文章推荐
- NOIP 2001统计单词个数 解题报告(记忆化搜索)
- noip2001 统计单词数
- RQNOJ 302 PID302 / [NOIP2001]统计单词个数(区间dp)
- 洛谷 P1026 [NOIP2001 T3] 统计单词个数
- NOIP 2000单词接龙 解题报告(爆搜)
- NOIP 2001解题报告
- [抄]NOIP 2001 统计单词个数
- RQNOJ PID302 / [NOIP2001]统计单词个数 (动态规划)
- 全国信息学奥林匹克联赛(NOIP2010)复赛 1.数字统计 解题报告
- ACM 94. [NOIP2001] 统计单词个数(划分dp)
- noip2001 统计单词个数 (动态规划-划分)
- 【动规递推】【NOIP2001】统计单词个数
- NOIP 2000 单词接龙 解题报告
- 【NOIP2001】统计单词个数
- NOIP 2001 求先序排列 解题报告
- NOIP 2001 Car的旅行路线 解题报告
- NOIP2001 统计单词个数 rabin-karp哈希
- NOIP 2001 数的划分 解题报告
- 07noip 统计数字 解题报告
- NOIP2001 统计单词个数