Vijos1118 统计单词个数
2015-10-25 21:31
246 查看
题目大意:给定一个长度20*p的字符串以及一个字典,求将该字符串分成k份后最多能包含多少个字典中的单词(某个字母不能同时作为多个单词的开头)。
思路:划分型DP。先预处理出在各个区间中包含的单词数,这里可以只记录最短单词的长度,因为一个字母只能提供一个开头。接下来就有f[i][k]=max(f[i][k],f[j][k-1]+cnt[j+1][i]),其中f[i][k]表示将前i个字符插入k个隔板(即划分成k+1份,所以刚开始输入的k要k–)所能获得的最大单词数。
代码如下:
思路:划分型DP。先预处理出在各个区间中包含的单词数,这里可以只记录最短单词的长度,因为一个字母只能提供一个开头。接下来就有f[i][k]=max(f[i][k],f[j][k-1]+cnt[j+1][i]),其中f[i][k]表示将前i个字符插入k个隔板(即划分成k+1份,所以刚开始输入的k要k–)所能获得的最大单词数。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> using namespace std; const int maxn=205; const int maxk=45; int T; int p,kt,n,ss; string s; int len[maxn],f[maxn][maxk],cnt[maxn][maxn]; string si[10]; void init() { memset(len,0x3f,sizeof(len)); scanf("%d%d",&p,&kt); kt--; string tmp; while (p--) { cin>>tmp; s+=tmp; } n=s.size(); scanf("%d",&ss); for (int i=1;i<=ss;++i) cin>>si[i]; } void sta() { for (int i=1;i<=ss;++i) { string tmp=si[i]; int now=0; while (true) { now=s.find(tmp,now); if (now==-1) break; if (len[now]>tmp.size()) len[now]=tmp.size(); now++; } } for (int i=0;i<=n-1;++i) for (int j=i;j<=n-1;++j) for (int k=i;k<=j;++k) { if (len[k]==0x3f3f3f3f) continue; if (k+len[k]-1>j) continue; cnt[i][j]++; } memset(f,-1,sizeof(f)); for (int i=0;i<=n-1;++i) f[i][0]=cnt[0][i]; } void dp() { for (int i=0;i<=n-1;++i) for (int j=0;j<i;++j) for (int k=1;k<=kt;++k) { if (f[j][k-1]==-1) continue; /*这里一定要加上特判,不能初始化为0,因为这是非法状态,但相应的cnt可以合法,不加会导致非法状态转移进合法状态,最终WA*/ if (f[j][k-1]+cnt[j+1][i]>f[i][k]) { f[i][k]=f[j][k-1]+cnt[j+1][i]; } } printf("%d\n",f[n-1][kt]); } int main() { init(); sta(); dp(); return 0; }
相关文章推荐
- 【wikioi】1017 乘积最大
- 【wikioi】1040 统计单词个数
- NOIP 2001统计单词个数 解题报告(记忆化搜索)
- NOIP 2000乘积最大 解题报告(划分型DP)
- OceanBase简介
- OOD沉思录 --- 类和对象的关系 --- 包含关系4
- 信息安全系统设计基础第七周学习总结
- printf输出字符串的一些格式
- Java中IO流文件读取、写入和复制
- 代码如人生——关于面向对象
- WebForm登陆验证,判断用户是否登陆 PageBase类
- C++ sort()函数一些简单的用法
- android程序登录或者欢迎activity应该注意的地方---超级bug
- 关于log4j的配置详情
- Chopsticks
- JQuery ligerUI ligerTree 基本使用方法
- 淘宝自主研发的海量数据库OceanBase开源
- JavaScript的闭包问题
- android file explorer 导出文件出现Failed to pull selection
- Debug和Release区别