P1026 统计单词个数 区间dp

时间:2023-01-14 15:42:59

  

题目描述

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

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

要求输出最大的个数。

输入输出格式

输入格式:

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

pp表示字串的行数,kk表示分为kk个部分。

接下来的pp行,每行均有2020个字符。

再接下来有11个正整数ss,表示字典中单词个数。(1 \le s \le 61≤s≤6)

接下来的ss行,每行均有11个单词。

输出格式:

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

输入输出样例

输入样例#1: 复制
1 3
thisisabookyouareaoh
4
is
a
ok
sab
输出样例#1: 复制
7

说明

this/isabookyoua/reaoh

一共有两个dp

第一个dp为预处理

必须要从后往前转移  这样遇到重复的也不会影响结果   如题意所得  每次判断具有后效性   所以当遇到这种情况的时候一定要从后往前dp  之前有一道安排工作的dp也是一样!!!!

注意 预处理的细节

第二个dp为区间dp

划分为k个区域只要加上k-1个隔板即可

然后就是注意 区间dp各种小细节!!!!

我做的时候有个疑问  为什么分隔点是s后面  而不能是当前处理区间末尾的前面一格分隔

想一想就知道是错的!!!。。。

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 2147483647
#define N 200
string s;
int k,q,n;
string table[];
int word[][];
int dp[][];
int len;
bool check(int i,int j)
{
/* string temp=s.substr(i,j-i+1);
rep(i,1,q)if(temp.find(table[i])==0)return true;
*/
rep(k,,q)
{
if(table[k].size()>j-i+)continue;
if(s.substr(i,table[k].size())==table[k])return true;
}
return false;
}
void init()
{
repp(j,len,)
repp(i,j,)
{
word[i][j]=word[i+][j];
if(check(i,j))word[i][j]++;
}
}
int main()
{
RII(n,k);
rep(i,,n)
{
string temp;
cin>>temp;
s+=temp;
}
len=s.size();
s='*'+s;//方便处理
RI(q);
rep(i,,q)
cin>>table[i];
init();
rep(i,,len)
dp[i][]=word[][i]; rep(i,,k-)//加入k-1个 分隔 最后就会分成k块
rep(j,i+,len)
rep(s,i,j-)//枚举断点s
dp[j][i]=max(dp[j][i],dp[s][i-]+word[s+][j]);//我不知道为什么改成word[s][j-1]不行 (否则 第三层循环没有任何意义 答案永远不会再更新了!!!) cout<<dp[len][k-];
}

P1026 统计单词个数 区间dp的更多相关文章

  1. &lbrack;luogu&rsqb;P1026 统计单词个数&lbrack;DP&rsqb;&lbrack;字符串&rsqb;

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

  2. luogu P1026 统计单词个数

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

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

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

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

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

  5. 【dp】P1026 统计单词个数

    题目描述 给出一个长度不超过200200的由小写英文字母组成的字母串(约定;该字串以每行2020个字母的方式输入,且保证每行一定为2020个).要求将此字母串分成kk份(1<k \le 401& ...

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

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

  7. P1026 统计单词个数 &lpar;动态规划&rpar;

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

  8. &lbrack;NOIP2001&rsqb; 提高组 洛谷P1026 统计单词个数

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

  9. NOIP2001统计单词个数&lbrack;序列DP&rsqb;

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

随机推荐

  1. Genymotion--最快的安卓模拟器 测试与模拟APP应用必备

    命令行工具,Eclipse插件,多操作系统 1 易于安装,易于运行 超过10个虚拟设备 您很匆忙?您想测试市场的主要设备?使用我们的虚拟设备! 2 控制功能强大的传感器来测试您的应用程序 自定义你的测 ...

  2. 使用mybatis操作mysql数据库SUM方法返回NULL解决

    使用SQL语句用函数SUM叠加的时候,默认查询没有值的情况下返回的是NULL,而实际可能我们要用的是返回0 解决: SELECT SUM(total)   FROM test_table 改成: SE ...

  3. &lbrack;转&rsqb; &lbrack;翻译&rsqb;图解boost&colon;&colon;bind

    http://kelvinh.github.io/blog/2013/12/03/boost-bind-illustrated/ 其实这是很久之前留的一个坑了,一直没有填.. 记得在刚开始看到 boo ...

  4. typedef 总结

    其实在正儿八经学C语言的时候typedef用的不是很多,记得书上对它的介绍只是一笔带过.的确它的用法是很简单,但这不代表在使用的过程中不会出错,今天来个彻底的总结. 作用:用来建立新的数据类型名.(注 ...

  5. Java基础-异常、断言

    处理错误 如果Java程序运行期间出现了错误,并且由于出现错误导致某些操作没有完成,程序应该能够返回到一种安全状态,并能够让用户执行一些其他的命令:或者允许用户保存所有操作结果,并以妥善的方式终止程序 ...

  6. 数据分析入门——numpy类库基础知识

    numpy类库是数据分析的利器,用于高性能的科学计算和数据分析.使用python进行数据分析,numpy这个类库是必须掌握的.numpy并没有提供强大的数据分析功能,而是它提供的ndarray数据结构 ...

  7. DRF中的APIView、GenericAPIView、ViewSet

    1.APIView(rest_framework.views import APIView),是REST framework提供的所有视图的基类,继承自Django的View. 传入到视图方法中的是R ...

  8. idea设置字体大小

    第一次玩儿idea,也是个新手小白,甚是惭愧,也是一步步慢慢摸索,下面我们按照步骤一步步操作 就可以了. 1.首先,先设置代码的字体大小: 2.设置周围菜单栏的字体大小: 3.设置控制台的字体大小:

  9. 青客宝团队Consul内部分享ppt

    青客宝团队Consul内部分享ppt   https://mp.weixin.qq.com/s?src=3&timestamp=1503647705&ver=1&signatu ...

  10. error nr&period;1045 access denied for user &&num;39&semi;root&&num;39&semi;&commat;&&num;39&semi;localhost&&num;39&semi; &lpar;using passwd&colon;no&rpar;

    在windows上卸载了mysql,再次重新安装的时候运行失败,并报以下错误: 解决办法: 1.服务里面停止Mysql服务. 2.卸载Mysql,删除MySQL的安装目录. 3.此外还要删除以下目录的 ...