题三 统计单词个数(30分)

问题描述
给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。
单词在给出的一个不超过6个单词的字典中。
要求输出最大的个数。
输入格式
去部输入数据放在文本文件input3.dat中,其格式如下:
第一行为一个正整数(0<n<=5)表示有n组测试数据
每组的第一行有二个正整数(p,k)
p表示字串的行数;
k表示分为k个部分。
接下来的p行,每行均有20个字符。
再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)
接下来的s行,每行均有一个单词。
输出格式
结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。

样例
输入:
1
1 3
thisisabookyouareaoh
4
is
a
ok
sab
输出: //说明:(不必输出)
7 // this/isabookyoua/reaoh

【思路】

DP+字符串。

最优划分。设d[i][j]表示把前i个数划分为j段的最大单词数。则有转移方程:

d[i][j]=max(d[i][j],d[k][j-1]+sum[k+1][i]);

  其中sum(s,t)表示st段内的单词数,离线计算。

【代码】

 #include<iostream>
#include<cstring>
using namespace std; const int maxn = +; string expr="";
string words[maxn];
int wordslen[maxn],sum[maxn][maxn];
int d[maxn][maxn];
int p,K,m; int add(int l,int r)
{
int ans=;
if (r->=) ans=sum[l][r-];
bool vis[maxn]={};
for (int i=;i<=m;i++)
{
int qd=r-wordslen[i]+;
if (qd<l) continue;
if (qd==expr.find(words[i],qd))
{
if (vis[qd]) continue;
vis[qd]=;
ans++;
for (int j=;j<=m;j++)
{
int dq=r-wordslen[j];
if (dq==qd)
if (dq==expr.find(words[j],dq))
{
ans--;
break;
}
}
}
}
return ans;
} int main() {
ios::sync_with_stdio(false);
cin>>p>>K;
for(int i=;i<p;i++) {
string s; cin>>s;
expr=expr+s;
}
cin>>m;
for(int i=;i<=m;i++) {
cin>>words[i];
wordslen[i]=words[i].size();
} int len=expr.size();
for(int i=;i<len;i++)
for(int j=i;j<len;j++){
sum[i][j]=add(i,j);
} for(int i=;i<len-;i++)
for(int j=;j<=min(K-,i+);j++)
for(int k=j-;k<i;k++)
if(j==) d[i][j]=sum[][j];
else d[i][j]=max(d[i][j],d[k][j-]+sum[k+][i]);
int ans=;
for(int i=K-;i<len-;i++)
ans=max(ans,d[i][K-]+sum[i+][len-]);
cout<<ans;
return ;
}

NOIP2001 统计单词个数的更多相关文章

  1. NOIP2001统计单词个数[序列DP]

    题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...

  2. Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)

    描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...

  3. 第六章 第一个Linux驱动程序:统计单词个数

    现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...

  4. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  5. NOIP200107统计单词个数

    NOIP200107统计单词个数 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给出一个长度不超过200的由 ...

  6. luogu P1026 统计单词个数

    题目链接 luogu P1026 统计单词个数 题解 贪心的预处理母本串从i到j的最大单词数 然后dp[i][j] 表示从前i个切了k次最优解 转移显然 代码 #include<cstdio&g ...

  7. Codevs 1040 统计单词个数

    1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...

  8. codevs1040统计单词个数(区间+划分型dp)

    1040 统计单词个数 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 给出一个长度不超 ...

  9. P1026 统计单词个数——substr

    P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度: 返回的是这一段字符串: 先预处理sum[i][j],表示以i开头,最多的单词数: 从后往前寻找,保 ...

随机推荐

  1. lua中的时间函数

    -- 获取当前的格林尼治时间print(os.time())-- 获取当前时间的字符串表示,形如:11/28/08 10:28:37print(os.date())-- 获取当前日期的字符串表示,形如 ...

  2. 检测浏览器对HTML5和CSS3支持情况的利器——Modernizr

    Modernizr是什么? Modernizr 是一个用来检测浏览器功能支持情况的 JavaScript 库. 目前,通过检验浏览器对一系列测试的处理情况,Modernizr 可以检测18项 CSS3 ...

  3. 如何在一整张背景图中,加隐形的a标签

    很常见的一个需求,就上图每个国家图标都得加上各自指定的a标签 这时,我们就可以去加上隐藏且定位准确的几个a标签 这个时候,主要用到的就是text-indent和overflow 这两个属性的配合.te ...

  4. fatal error C1853

    http://myswirl.blog.163.com/blog/static/513186422011827105224739/ 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C ...

  5. 基于android混合开发的JsBridge技术学习

    1.无JsBridge. js如果要调用java(native.也说原生)方法:则java必须实现js接口供挂载在window对象上供js来执行. 这里简单的可以只调用,调用后java端什么也不做.复 ...

  6. Hex、bin、axf、elf格式文件小结

    转自Hex.bin.axf.elf格式文件小结 一.HEX Hex文件,一般是指Intel标准的十六进制文件.Intelhex 文件常用来保存单片机或其他处理器的目标程序代码.它保存物理程序存储区中的 ...

  7. Vmware 8.00 文件共享ubuntu

    http://bolg.sinaapp.com/html/2012/1848.html 这是解决vm不能共享的解决方案. 今天学会的Linux命令: cp -i *** ~/tmp cd VMware ...

  8. DLX模板

    对于数独问题 ; //3*3数独 ; // 一格能填9个数 9*9格 +; // 9*9*4=(9+9+9)*9+9*9 (9+9+9)是9行 9列 9格 *9是9个数 9*9是81个格子 +MaxM ...

  9. [杂题]CSUOJ1276 Counting Route Sequence

    题目链接 题意:从1号点走到n号点(每条边只能走一次, 两结点间的边数必定为奇数) 问 经过结点不同顺序的方式有多少种(如1->2->3->4和1->3->2->4 ...

  10. org.dom4j.DocumentException unknown protocol h

    待解析文件的路径中有空格,把空格去掉就好了