题目描述

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。

单词在给出的一个不超过6个单词的字典中。

要求输出最大的个数。

输入输出格式

输入格式:

每组的第一行有二个正整数(p,k)

p表示字串的行数;

k表示分为k个部分。

接下来的p行,每行均有20个字符。

再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)

接下来的s行,每行均有一个单词。

输出格式:

一个整数,分别对应每组测试数据的相应结果。

输入输出样例

输入样例#1:

1 3
thisisabookyouareaoh
4
is
a
ok
sab
输出样例#1:

7

不得不说最开始我连题意都没看懂,2333。

大概意思是说,给你一串字符,你将这个字符划分成k块,使每一块包含的单词数总和最多。
我的想法是用两次动态规划,第一次设置一个数组cnt_word[i][j](不要吐槽为什么名字那么长)
它表示从i号到j号包含多少单词数,然后就很好推,如果从i号到j号有以i号为头的字母,那么cnt_word[i][j]=cnt_word[i+1][j]+1,
如果不存在,那么就是cnt_word[i][j]=cnt_word[i+1],
可以用strstr来判断是否包含,并且判断是否以a[i]开头,
接下来就很好推了,就是枚举枚举区间。
注意第一个细节,字符串编号是从0开始,那么,范围应是0-(p*20-1),
第二,枚举区间时要注意,不要让某个区间为空,那样一定会错(如果没错,不要拆穿我。)
好了,看不懂的看我代码吧,我会加上注释。

 #include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int cnt_hang=,cnt_fen=,cnt_words=;
char a[];
char words[][];
int cd_words[]={};//记录每个单词的长度
int cnt_word[][]={};//表示从某开头到某时,能有多少单词.
int jiyi[][]={};
void jilv( );
int cha(int ks,int js);
int dg(int ks,int fen); void jilv( ){
for(int y=cnt_hang*-;y>=;y--)//注意范围
for(int x=y;x>=;x--){
if(cha(x,y)!=)cnt_word[x][y]=cnt_word[x+][y]+;
else cnt_word[x][y]=cnt_word[x+][y];
}
return;
} int cha(int ks,int js){
for(int x=;x<=cnt_words;x++){
char *p=strstr(&a[ks],words[x]);
//表示询问单词x是否是从a[ks]到结束这一段的字符的字串.如果不是,会返回0,如果是 就会返回str2在str1中首次出现的地址
if(p!=&&p-&a[ks]==&&cd_words[x]<=js-ks+)return ;
//如果是字串,且是以a[ks]的字串,并且是在ks到js这一段以内的字串,那么就返回1,
}
return ;
} int dg(int ks,int fen){
//不要吐槽我为什么不用递推,这下面就很好理解了,就是枚举区间.
if(fen==)return cnt_word[ks][cnt_hang*-];
if(jiyi[ks][fen]!=-)return jiyi[ks][fen];
for(int x=ks;x<=cnt_hang*-fen;x++)
jiyi[ks][fen]=max(jiyi[ks][fen],dg(x+,fen-)+cnt_word[ks][x]);
return jiyi[ks][fen];
} int main(int argc, char *argv[]) {
cin>>cnt_hang>>cnt_fen;
cin>>a;
for(int x=;x<=cnt_hang;x++){
char b[];
cin>>b;
strcat(a,b);//表示将b接在a串后面. 注,大多str开头的函数都必须用<cstring>的头文件
}
//cout<<a<<endl;
cin>>cnt_words;
for(int x=;x<=cnt_words;x++){
cin>>words[x];
cd_words[x]=strlen(words[x]);//表示计算长度
}
jilv( );//第一个动归
memset(jiyi,-,sizeof(jiyi));
int ans=dg(,cnt_fen); //就是一个枚举区间
cout<<ans;
return ;
}

洛谷 P1026 统计单词个数的更多相关文章

  1. 洛谷 P1026 统计单词个数 Label:dp

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

  2. [NOIP2001] 提高组 洛谷P1026 统计单词个数

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

  3. 洛谷P1026 统计单词个数【区间dp】

    题目:https://www.luogu.org/problemnew/show/P1026 题意: 给定一个字符串,要求把他分成k段.给定s个单词,问划分成k段之后每段中包含的单词和最大是多少. 一 ...

  4. 洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)

    一看完这道题就知道是划分型dp 有两个点要注意 (1)怎么预处理子串. 表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0 (2)dp的过程 这种分成k组最优的题目已经高度模板化了,我总 ...

  5. luogu P1026 统计单词个数

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

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

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

  7. [luogu]P1026 统计单词个数[DP][字符串]

    [luogu]P1026 统计单词个数 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1&l ...

  8. P1026 统计单词个数 (动态规划)

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

  9. 洛谷 P1308 统计单词数【字符串+模拟】

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...

随机推荐

  1. python学习笔记--随时更新

    # coding=GBK score = 90 if score >= 80: print("好") elif score >= 60: print("及格& ...

  2. 图像处理简单实例[OpenCV 笔记1]

    几个入门的简单程序,和对应的CMakeList, 虽然简单重新测一下写一下也是好的. CMake教程传送门 图像显示 ShowImage.cxx #include <opencv2/opencv ...

  3. 【BZOJ1875】【矩阵乘法】[SDOI2009]HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...

  4. js 默认的参数、可变的参数、变量作用域

    可以通过arguments对象来实现可变的参数 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. arguments是一个数组对象,可以通过下标来实别参数的位置 ...

  5. 一种轻量的openresty路由设计

    在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口 ...

  6. 不支持关键字: “userid”。

    运行程序提示:不支持关键字: “userid”. 找了很久在一篇博客里面提示web.config数据库字符串链接出错.

  7. PAT (Basic Level) 1004. 成绩排名 (20)

    读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...

  8. jQuery 表格插件25

    jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...

  9. 判断是否为ie(包含ie11)

    if (!!window.ActiveXObject || "ActiveXObject" in window) { alert("IsIE"); }

  10. Codeforces Round #204 (Div. 2): B

    很简单的一个题: 只需要将他们排一下序,然后判断一下就可以了! 代码: #include<cstdio> #include<algorithm> #define maxn 10 ...