一看完这道题就知道是划分型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再次总结)的更多相关文章

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

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

  2. 洛谷 P1026 统计单词个数

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

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

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

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

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

  5. luogu P1026 统计单词个数

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

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

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

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

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

  8. P1026 统计单词个数 (动态规划)

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

  9. 洛谷 P1308 统计单词数【字符串+模拟】

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...

随机推荐

  1. js获取英文名字的首字母

    场景:网站登录之后要将用户姓名的英文名字的首字母转换成大写的放上去. var str='zhang san'; var arr=str.split(" "); var fristC ...

  2. JavaScript 运行机制 & EventLoop

    JavaScript 运行机制 & EventLoop 看阮老师博客和自己的理解,记录的学习笔记,js的单线程和 事件EventLoop 机制. 1. JavaScript是单线程 JavaS ...

  3. [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)

    题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...

  4. BZOJ 2118 墨墨的等式 (同余最短路)

    题目大意:已知B的范围,求a1x1+a2x2+...+anxn==B存在非负正整数解的B的数量,N<=12,ai<=1e5,B<=1e12 同余最短路裸题 思想大概是这样的,我们选定 ...

  5. linux之资料重定向

    標準輸入 (stdin) :代碼為 0 ,使用 < 或 << : 標準輸出 (stdout):代碼為 1 ,使用 > 或 >> : 標準錯誤輸出(stderr):代 ...

  6. 全面的framebuffer详解

    一.FrameBuffer的原理    FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口.    Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIO ...

  7. 【codeforces 767E】Change-free

    [题目链接]:http://codeforces.com/problemset/problem/767/E [题意] 你有m个1元硬币和无限张100元纸币; 你在第i天,需要花费ci元; 同时在第i天 ...

  8. C#窗体间的跳转传值

    1.开发平台VS2012 2.需求:从一个窗体跳转到另一个窗体,并传递参数,接收返回值. 3.案列如图: 4.代码如下: 登陆窗体: //当点击注册按钮 private void button2_Cl ...

  9. ASP.NET-EF基础知识

    定义 asp.net Entity Framework是微软以ADO.NET为基础发展出来的对象关系对应(OR Mapping)解决方案.   三种EF工作模式(自己理解的) 从数据库表创建类 从类创 ...

  10. UVA 1329 Corporative Network【并查集】

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...