题目描述

给出一个长度不超过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. [luogu]P1026 统计单词个数[DP][字符串]

    [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 统计单词个数 (动态规划)

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

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

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

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

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

随机推荐

  1. 大数据mapreduce俩表join之python实现

    二次排序 在Hadoop中,默认情况下是按照key进行排序,如果要按照value进行排序怎么办?即:对于同一个key,reduce函数接收到的value list是按照value排序的.这种应用需求在 ...

  2. Java语法基础常见疑惑解答8,16,17,21图片补充

    8. 16. 17. 21

  3. django 中自带的加密方法

    导入django 自带的加密算法 和flask中的哈希加密有一曲同工之妙.        from django.contrib.auth.hashers import make_password, ...

  4. laravel 容器注入的坑

    今天遍历添加数据时遇到个坑,哪位大神知道什么原因?? 起初的代码是这样的:(部分) public function addActive(Request $request, Activenorms $a ...

  5. spring-data-mongo的MongoTemplate开发

    spring-data-mongo的MongoTemplate开发 1.在实体类Customer.Java中引入注解表明转换方式 @Document   //文档 public class Custo ...

  6. linux把程序做成系统服务并自启动

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 一.chkconfig 的使用语法1.c ...

  7. js 打开摄像头方法 (定制摄像头)

    var video = document.getElementById("video");if (navigator.mediaDevices && navigat ...

  8. String 类的实现(3)String类常用函数

      2 #include<iostream> 3 #include<stdio.h> 4 #include<assert.h> 5 #include <iom ...

  9. P0505

      算法训练 P0505   时间限制:1.0s   内存限制:256.0MB      一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积.阶乘的增长速度非常快,例如,13!就已经比较大了 ...

  10. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...