洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)
一看完这道题就知道是划分型dp
有两个点要注意
(1)怎么预处理子串。
表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0
(2)dp的过程
这种分成k组最优的题目已经高度模板化了,我总结一下吧
//f[i][j]表示把前j个数分成i组的最优价值
memset(f, 0xc0, sizeof(f)); //初始化
f[0][0] = 0; //不要忘记了
_for(k, 1, K) //枚举组数
_for(i, 1, len) //前i个字符
_for(j, 1, i) //断点
f[k][i] = max(f[k][i], f[k-1][j-1] + sum[j][i]); //字母不要写错
printf("%d\n", f[K][len]);
最后用string可以很方便的连接字符串,直接+=
char的话用strcat, stract(a, b)表示把b连到a后面
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iostream>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 212;
string s, t, word[10];
int p, K, n, sum[MAXN][MAXN], f[MAXN][MAXN];
bool judge(int i, int j)
{
REP(r, 0, n)
{
int len = word[r].length();
if(len > (j - i + 1)) continue;
REP(k, 0, len)
{
if(word[r][k] != s[i+k]) break;
if(k == len - 1) return true;
}
}
return false;
}
int main()
{
while(~scanf("%d%d", &p, &K))
{
s = "0";
REP(i, 0, p)
{
cin >> t;
s += t;
}
p *= 20;
scanf("%d", &n);
REP(i, 0, n) cin >> word[i];
memset(sum, 0, sizeof(sum));
_for(j, 1, p)
for(int i = j; i >= 1; i--)
sum[i][j] = sum[i+1][j] + judge(i, j);
memset(f, 0xc0, sizeof(f));
f[0][0] = 0;
_for(k, 1, K)
_for(i, 1, p)
_for(r, 1, i)
f[k][i] = max(f[k][i], f[k-1][r-1] + sum[j][i]);
printf("%d\n", f[K][p]);
}
return 0;
}
洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)的更多相关文章
- 洛谷 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),且每份中包含的 ...
- 洛谷P1026 统计单词个数【区间dp】
题目:https://www.luogu.org/problemnew/show/P1026 题意: 给定一个字符串,要求把他分成k段.给定s个单词,问划分成k段之后每段中包含的单词和最大是多少. 一 ...
- 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开头,最多的单词数: 从后往前寻找,保 ...
- [luogu]P1026 统计单词个数[DP][字符串]
[luogu]P1026 统计单词个数 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1&l ...
- P1026 统计单词个数 (动态规划)
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- 洛谷 P1308 统计单词数【字符串+模拟】
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
随机推荐
- java的算法实现冒泡
package xutao3;public class test1 { public static void main(String[] args) { int[] arr={12,88,66,55, ...
- CSS骚操作
获取当前HTML页面根元素的字体大小 getComputedStyle(document.getElementsByTagName("html")[0],undefined).fo ...
- 02 C#高级
第九天 面向过程--à面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱 1. 打开冰箱门 2. 把大象塞进去,亲下大象的屁股 3. 关闭冰箱门 孙全 瘦小 ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- 关于使用动态语言运行时 (. net)
AutoCAD Managed .NET API允许您使用使用. NET 4.0 引入的动态语言运行时 (DLR). 使用DLR可以直接访问对象, 而无需: 打开一个对象进行读取或写入, 然后在完成后 ...
- java中BufferedReader 有什么用
这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的. BufferedReader buffer ...
- Lock-less and zero copy messaging scheme for telecommunication network applications
A computer-implemented system and method for a lock-less, zero data copy messaging mechanism in a mu ...
- apk去广告工具(利用apktool去除apk文件里的广告)
基本知识 apk安装包的文件结构 以知名桌面软件“LauncherPro”为例,apk安装包文件目录: 文件目录如下: - META-INF - res - anim - color - drawab ...
- pcap网络抓包 无法import pcap
坑爹的不知道从哪里看到说仅仅有pcap最多仅仅支持到python2.5,然后又是easy install又是安装pip就是无法成功import pcap... 我的python版本号是2.7.8. s ...
- 从头认识Spring-3.4 简单的AOP日志实现-扩展添加检查订单功能,以便记录并检測输入的參数
这一章节我们再上一个章节的基础上加上一个检查订单功能 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1 ...