题目https://www.luogu.org/problemnew/show/P1026

题意:

给定一个字符串,要求把他分成k段。给定s个单词,问划分成k段之后每段中包含的单词和最大是多少。

一个位置作为单词的开头只能计算一次。

思路:

如果仅仅是统计某一个区间内的最大单词数,这比较简单。每次从后往前推一个字符,如果这个字符是一个单词的开头,那么$cnt[i][j] = cnt[i+1][j]+1$

但是现在要分成$j$段,这是状态之一,另一个状态应该是已经考虑前$i$个字符。

也就是用$dp[i][j]$表示前$i$个字符划分成$j$段的最大单词数。

很显然$dp[i][j] = dp[d][j-1] + cnt[d +1][i]$,也就是说在$0~i$之间找到一个位置$d$,从这里断开,前面的组成$j-1$段,后面的作为一个新的段。

需要考虑的是,一个只有$i$个字符的字符串,最多只能划分成$i$段。

并且要注意当$j =1$时需要特殊处理。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; int p, k, s;
const int maxn = ;
string str;
string word[];
int cnt[maxn][maxn];
int dp[maxn][maxn]; int main()
{
scanf("%d%d", &p, &k);
for(int i = ; i < p; i++){
string tmp;
cin>>tmp;
str += tmp;
}
scanf("%d", &s);
for(int i = ; i <= s; i++){
cin>>word[i];
} int len = str.length(); for(int i = len - ; i >= ; i--){
for(int j = i; j >= ; j--){
for(int x = ; x <= s; x++){
int l = word[x].length();
if(str.substr(j, min(i - j + , l)) == word[x]){
cnt[j][i] = cnt[j + ][i] + ;
break;
}
else cnt[j][i] = cnt[j + ][i];
//cout<<str.substr(j, min(i - j + 1, l))<<" "<<cnt[j][i]<<endl;
} }
} for(int i = ; i <= k; i++){
dp[i][i] = dp[i - ][i - ] + cnt[i][i];
}
for(int i = ; i < len; i++){
dp[i][] = cnt[][i];
for(int j = ; j <= min(k, i); j++){
for(int d = j - ; d < i; d++){
dp[i][j] = max(dp[i][j], dp[d][j - ] + cnt[d + ][i]);
}
}
} printf("%d\n", dp[len - ][k]); return ;
}

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

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

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

  2. P1026 统计单词个数 区间dp

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

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

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

  4. 洛谷 P1026 统计单词个数

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

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

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

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

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

  7. luogu P1026 统计单词个数

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

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

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

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

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

随机推荐

  1. [转帖]密钥库文件格式(Keystore)和证书文件格式(Certificate)

    密钥库文件格式[keystore]代码 https://blog.csdn.net/zzhongcy/article/details/22755317 格式 : JKS 扩展名 : .jks/.ks ...

  2. 【转帖】Linux上搭建Samba,实现windows与Linux文件数据同步

    Linux上搭建Samba,实现windows与Linux文件数据同步 2018年06月09日 :: m_nanle_xiaobudiu 阅读数 15812更多 分类专栏: Linux Samba 版 ...

  3. [百度贴吧]飞腾1500a .VS. 龙芯3a3000: 同频实用性能对比

    贴吧关于 龙芯与飞腾的简单对比. https://tieba.baidu.com/p/5682824804?red_tag=0221728732 龙芯3a3000实用性能 ,还不如4年前发布的FT15 ...

  4. Hadoop集群搭建-01前期准备

    Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS  Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...

  5. Docker的安装和学习

    dockers学习 2019年2月23日开始     docker系统要求             centos 7 核心为3.1以上         centos6.5以上 核心为 2.6以上    ...

  6. python学习-5 python基础-2 条件语句(if的简单用法2---elif)

    1.if的基本语句 if条件: 内部代码块 else: ........ print(‘.......’) 2.if语句支持嵌套 if条件: 内部代码块 if条件: 内部代码块 else: ..... ...

  7. Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制

    服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...

  8. 进程程序替换(自主实现shell)

    进程替换 替换进程所运行的程序 流程:将另一段代码加载到内存中,通过页表将原来进程的映射关系重新建立到新的程序在内存中的地址,相当于替换了进程所运行程序以及所要处理的数据 (替换了代码段,重新初始化数 ...

  9. springMvc 框架

    第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler 可以根据xml配置.注解进行查找 第三步:处理器映射器Han ...

  10. regex 正则分割字符串

    string _content=adak.sjdkajskj爱25教:师的656教案时; string en=@"\.|56|25";//单个[asj]分别以a,s,j为分隔符. ...