传送门

想了个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. Python之列表生成式、生成器

    列表生成式 ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁: >>> [x * x for x in range(1, 11)] [1, 4, ...

  2. jQuery——表单应用(2)

    多行文本框应用之高度变化 HTML: <!--表单-多行文本框应用-高度变化--> <!DOCTYPE html> <html> <head> < ...

  3. Manacher HDOJ 5371 Hotaru's problem

    题目传送门 /* 题意:求形如(2 3 4) (4 3 2) (2 3 4)的最长长度,即两个重叠一半的回文串 Manacher:比赛看到这题还以为套个模板就行了,因为BC上有道类似的题,自己又学过M ...

  4. WinForm ListBox 控件用法

    下面演示如何利用列表控件 ListBox 实现多选与移动选项: using IMS.WinFormClient.UserControls; using System; using System.Col ...

  5. 282 Expression Add Operators 给表达式添加运算符

    给定一个仅包含0-9的字符串和一个目标值,返回在数字之间添加了二元运算符(不是一元的) +.-或*之后所有能得到目标值的情况.例如:"123", 6 -> ["1+ ...

  6. 网站开发综合技术 第二部分 CSS样式表

    第2部分 CSS样式表 CSS(Cascading Style Sheets,层叠样式表),作用是美化HTML网页. /*注释*/    注释语法 2.1.样式表的基本概念 2.1.1.样式表分类 1 ...

  7. [ Luogu 3935 ] Calculating

    \(\\\) \(Description\) 若\(x\)分解质因数结果为\(x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n}\),令\(f(x)=(k_1+1)(k_2+1) ...

  8. js中关于string转date类型的转换

    var date_up = input.split("-");//input表示string类型(时间例如:2017-11-12 10:07:36.653) var date_do ...

  9. win7下安装MySQL 5.7.19(解压缩版)

    1.官网下载地址:https://downloads.mysql.com/archives/community/ 下载后,得到压缩包: 2.解压,我的解压目录为:E:\mysql-5.7.19\mys ...

  10. LDA主题模型(理解篇)

    何谓“主题”呢?望文生义就知道是什么意思了,就是诸如一篇文章.一段话.一个句子所表达的中心思想.不过从统计模型的角度来说, 我们是用一个特定的词频分布来刻画主题的,并认为一篇文章.一段话.一个句子是从 ...