P1026 统计单词个数 区间dp
题目描述
给出一个长度不超过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个整数,分别对应每组测试数据的相应结果。
输入输出样例
说明
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的更多相关文章
- [luogu]P1026 统计单词个数[DP][字符串]
[luogu]P1026 统计单词个数 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1&l ...
- luogu P1026 统计单词个数
题目链接 luogu P1026 统计单词个数 题解 贪心的预处理母本串从i到j的最大单词数 然后dp[i][j] 表示从前i个切了k次最优解 转移显然 代码 #include<cstdio&g ...
- P1026 统计单词个数——substr
P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度: 返回的是这一段字符串: 先预处理sum[i][j],表示以i开头,最多的单词数: 从后往前寻找,保 ...
- 洛谷P1026 统计单词个数【区间dp】
题目:https://www.luogu.org/problemnew/show/P1026 题意: 给定一个字符串,要求把他分成k段.给定s个单词,问划分成k段之后每段中包含的单词和最大是多少. 一 ...
- 【dp】P1026 统计单词个数
题目描述 给出一个长度不超过200200的由小写英文字母组成的字母串(约定;该字串以每行2020个字母的方式输入,且保证每行一定为2020个).要求将此字母串分成kk份(1<k \le 401& ...
- 洛谷 P1026 统计单词个数 Label:dp
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- P1026 统计单词个数 (动态规划)
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- [NOIP2001] 提高组 洛谷P1026 统计单词个数
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保 证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的 ...
- NOIP2001统计单词个数[序列DP]
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
随机推荐
- 【原创】大叔经验分享(31)CM金丝雀Canary报错
CM金丝雀Canary报错 1 HDFS 金丝雀Canary 测试无法为 /tmp/.cloudera_health_monitoring_canary_files 创建父目录. 2 Hive Met ...
- su命令
作用: 切换 用户 选项: -:可以更改当前目录为切换用户的家目录 使用: # 切换用户,当前所在用户目录不变 su 用户名 # 切换用户,当前所在目录改为切换对象的家目录 /home/用户名 su ...
- nginx负载均衡后端tomcat无法加载js资源
JS或css无法完全加载 nginx的代理缓存区,默认较小导致部分文件出现加载不全的问题,比较典型的如jQuery框架,可以通过配置调整nginx的缓存区即可.主要参考proxy参数 最终完整配置如下 ...
- swift 学习- 26 -- 泛型
// 泛型 代码能够让你根据自定义的需求,编写出适用于任意类型, 灵活可重用的函数以及类型, 它能让你避免代码的重复, 用一种清晰和抽象的方式来表达代码的意图 // 泛型是 Swift 最强大的特性之 ...
- swift 学习- 10 -- 类和结构体
// '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...
- Java 的 Api 文档生成工具 JApiDocs 程序文档工具
JApiDocs 详细介绍 简介 JApiDocs 是一个符合 Java 编程习惯的 Api 文档生成工具.最大程度地利用 Java 的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs ...
- Confluence 6 警告的类型
有下面的一些类型的警告. 警告和知识库(Alert and KB) 级别(Level) 默认阈值(Default threshold) 可配置(Configurable) Low free disk ...
- Confluence 6 从外部小工具中注册访问
希望从 Confluence 中删除一个小工具,你可以选择小工具边上的 URL ,然后单击删除(Delete). 如果你希望取消订阅一个应用的小工具,你需要删除整个订阅.你不能仅仅删除你订阅中的某一个 ...
- python之线程同步
lock与rlock 使用lock不能连续两次获取锁,获取锁必须先释放锁.但是在一个线程中调用另一个函数时,在该函数中要继续操作共享的数据,这时获取锁就相当于连续执行两次获取锁,所以lock就不适用该 ...
- 基于Manhattan最小生成树的莫队算法
点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...