传送门

想了个4次方算法,没想到也A了,数据真是水。

其实两个字符串匹配那部分可以用kmp优化

——代码

 #include <cstdio>
#include <cstring> int n, m, f[];
char s[], a[][]; inline int max(int x, int y)
{
return x > y ? x : y;
} int main()
{
int i, j, k, l, len;
scanf("%s %d", s + , &n);
for(i = ; i <= n; i++) scanf("%s", a[i] + );
m = strlen(s + );
for(i = ; i <= m; i++)
for(j = ; j <= n; j++)
{
len = strlen(a[j] + );
if(i >= len)
for(k = i; k; k--)
{
for(l = len; l; l--) if(s[k - (len - l)] ^ a[j][l]) break;
if(!l) f[i] = max(f[i], f[k - len] + );
}
}
printf("%d\n", f[m]);
return ;
}

正解

f[i] 表示前 i 个字符串的最优解

f[i] = max(f[i], f[i - 1])

f[i] = max(f[i], f[j - 1] + 1) (len[j ~ i] 为字典中出现过的单词)

len[j ~ i] 是以 j 为前缀的单词,可以用trie树搞。

——代码

 #include <cstdio>
#include <cstring>
#define idx(x) x - 'a'
#define max(x, y) ((x) > (y) ? (x) : (y)) int n, cnt;
int ch[][], val[], f[];
char s[], a[]; inline void insert()
{
int i, x, now = , len = strlen(a);
for(i = ; i < len; i++)
{
x = idx(a[i]);
if(!ch[now][x]) ch[now][x] = ++cnt;
now = ch[now][x];
}
val[now]++;
} int main()
{
int i, j, len, now;
scanf("%s", s + );
scanf("%d", &n);
for(i = ; i <= n; i++)
{
scanf("%s", a);
insert();
}
len = strlen(s + );
for(i = ; i <= len; i++)
{
f[i] = max(f[i], f[i - ]);
for(j = i, now = ; ch[now][idx(s[j])] && j <= len; j++)
{
now = ch[now][idx(s[j])];
if(val[now]) f[j] = max(f[j], f[i - ] + );
}
}
printf("%d\n", f[len]);
return ;
}

[luoguP2031] 脑力达人之分割字串(DP)的更多相关文章

  1. P2031 脑力达人之分割字串

    P2031 脑力达人之分割字串字符串dp,f[i]表示主串到第i个字符,最多能分割成多少子串.f[i]=max(f[i],f[k]+1);k是能匹配到的前一位. #include<iostrea ...

  2. 洛谷 P2031 脑力达人之分割字串

    题目传送门 解题思路: f[i]表示到第i位可获得的最大分割次数,对于每个f[i]都可由其符合条件的前缀转移过来,条件就是当前串除了前缀的剩余字符里有所给单词,然后一看,这不是在剩余字符里找有没有所给 ...

  3. PHP 分割字串 Function 的速度比較(substr/sscanf/preg_match)---substr最快!

    固定長度的字串(假設是 06481a63041b578d702f159f520847f8), 要照固定格式做切割, 使用 PHP 要怎麼切會比較快? 註: 要將此字串切成 => 06 / 48 ...

  4. 根据token分割字串

    #include <iostream> #include <string> #include <cstring> int main() { const char * ...

  5. 【Foreign】字串变化 [DP]

    字串变化 Time Limit: 10 Sec  Memory Limit: 128 MB Description 定义一个(大写字母)字符串集合{S},初始时值包含一个给定的字符串S1,每次从中任意 ...

  6. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  7. 【NOIP2015】字串

    [NOIP2015]字串 标签: DP NOIP Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其 ...

  8. shell脚本 字串截取 正则表达式

    字串处理 子串截取方法一:使用${}表达式格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略) 方法二:使用expr substr格式:expr substr "$x&q ...

  9. P1279 字串距离

    P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...

随机推荐

  1. Visual Studio Code 扩展工具集,记录

    编码 提高效率及校验 Auto Close Tag 自动闭合标签 Auto Rename Tag 自动更改HTML/XML标签,不需要再进行二次修改,减少50%的工作量! Path Intellise ...

  2. Java多线程(三)SimpleDateFormat

    多线程报错:java.lang.NumberFormatException: multiple points SimpleDateFormat是非线程安全的,在多线程情况下会有问题,在每个线程下得各自 ...

  3. [读书笔记1]《C语言嵌入式系统编程修炼》

      大学前两年一直搞的是单片机,写的是嵌入式C语言程序,走过了不少弯路,现在感觉仍然在走弯路.有幸偶尔看到了这篇文章,深感自己以前写程序的时候存在很多误区.现写篇博客做下总结. 作者:宋宝华出处:天极 ...

  4. Hdu 4612 Warm up (双连通分支+树的直径)

    题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...

  5. Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)

    题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比 ...

  6. 简单几何(水)BestCoder Round #50 (div.2) 1002 Run

    题目传送门 /* 好吧,我不是地球人,这题只要判断正方形就行了,正三角形和正五边形和正六边形都不可能(点是整数). 但是,如果不是整数,那么该怎么做呢?是否就此开启计算几何专题了呢 */ /***** ...

  7. duilib入门问题集

    问:如何把资源放入zip?答: 先SetResourcePath设置资源目录,再SetResourceZip设置压缩资源文件名 问:如何设置窗体的初始化大小?答:设置XML文件的Window标签的si ...

  8. 利用反射重写toString()方法

    为了方便输出对象,Object类提供了toString()方法.但是该方法的默认值是由类名和哈希码组成的,实用性并不强.通常需要重写该方法以提供更多的信息.本实例使用反射输出类的包.类的名字.类的公共 ...

  9. Linux系统资源监控--linux命令、nmon和spotlight

    前言: 系统资源监控一般监控系统的CPU,内存,磁盘和网络.系统分为windows和Linux.本篇主要记录Linux. Linux系统资源监控常用命令及工具 一.常用命令:top.free.iost ...

  10. 第一次创建svn的项目的使用方法

    1.第一步.在服务器上创建svn项目,将开发人人员你的账号密码添加上去. 2.第二步.开始在本地创建一个文件夹,点文件夹,右键->tortoisSVN->repo-brower 填写svn ...