【bzoj2121】字符串游戏 区间dp
题目描述
输入
输出
输出一个整数,表示L的最短长度。
样例输入
aaabccd
3
ac
abc
aaa
样例输出
2
题解
我们考虑:每次删除连续的一段,对应到原串上即:删除 $[l,r]$ 中所有未被删除的字符。其中 $l,r$ 都未被删除。
这样就相当于选择若干区间来删除。
注意到选择的任意两个区间要么包含要么不相交(相离),对于相邻的相离的也可以看作是包含(右区间左端点看作是左区间左端点,即一个空位置),因此只有包含关系。
那么如下图:

先选择 $[b,c]$ 的串 $S$ ,再选择 $[a,d]$ 的串 $T$ ,可以看作是处理出 $[a,b)$ 能够匹配到 $T$ 的中间位置,$[b,c]$ 能够匹配到 $S$ 的结束位置(即删除掉),进而推知 $[a,c]$ 能够匹配到 $T$ 的中间位置,再向右匹配得知 $[a,d]$ 能够匹配到 $T$ 的结束位置。
考虑区间dp。设 $f[l][r]$ 表示 $[l,r]$ 是否可以全部删掉,再设 $g[l][r][i][j]$ 表示 $[l,r]$ 是否能够删成第 $i$ 个字符串的前 $j$ 个字符。
那么考虑区间 $[l,r]$ ,如果进行匹配的话转移为 $g[l][r][i][j]=g[l][r-1][i][j-1]$ ,前提条件 $str[r]==w[i][j]$ ,即区间右端点和第 $i$ 个串的第 $j$ 个字符相同。
如果不进行匹配的话,$r$ 一定在某个 $[k,r]$ 中被消掉,因此枚举 $k\in[l,r]$ ,转移为 $g[l][r][i][j]=g[l][k-1][i][j]\&\&f[k][r]$ 。
根据 $f$ 的定义有转移 $f[l][r]=g[l][r][i][len[i]]$ 。
这样我们就能够推出 $f$ 和 $g$ 。
再考虑答案:设 $h[i]$ 表示前 $i$ 个字符的答案,那么 $h[i]=h[i-1]+1$ ;如果某个 $j$ 满足 $f[j][i]=1$ ,即 $[j,i]$ 能删掉,则还有 $h[i]=h[j-1]$ 。
最终答案就是 $h[n]$ 。
时间复杂度 $O(n^3·m·len)$
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bool f[155][155] , g[155][155][35][25];
char str[155] , w[35][25];
int c[35] , ans[155];
int main()
{
int n , m , len , l , r , i , j , k;
scanf("%s%d" , str + 1 , &m) , n = strlen(str + 1);
for(i = 1 ; i <= m ; i ++ ) scanf("%s" , w[i] + 1) , c[i] = strlen(w[i] + 1);
for(i = 1 ; i <= n ; i ++ )
{
f[i][i - 1] = 1;
for(j = 1 ; j <= m ; j ++ )
g[i][i - 1][j][0] = 1;
}
for(len = 1 ; len <= n ; len ++ )
{
for(l = 1 ; l <= n - len + 1 ; l ++ )
{
r = l + len - 1;
for(i = 1 ; i <= m ; i ++ )
{
for(j = 1 ; j <= c[i] ; j ++ )
if(str[r] == w[i][j])
g[l][r][i][j] |= g[l][r - 1][i][j - 1];
for(j = 0 ; j <= c[i] ; j ++ )
for(k = l ; k <= r ; k ++ )
g[l][r][i][j] |= g[l][k - 1][i][j] & f[k][r];
}
for(i = 1 ; i <= m ; i ++ ) f[l][r] |= g[l][r][i][c[i]];
}
}
for(i = 1 ; i <= n ; i ++ )
{
ans[i] = ans[i - 1] + 1;
for(j = 1 ; j <= i ; j ++ )
if(f[j][i])
ans[i] = min(ans[i] , ans[j - 1]);
}
printf("%d\n" , ans[n]);
return 0;
}
【bzoj2121】字符串游戏 区间dp的更多相关文章
- BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)
2121: 字符串游戏 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 672 Solved: 376[Submit][Status][Discuss ...
- BZOJ2121 字符串游戏 【dp】
题目链接 BZOJ2121 题解 dp怎么那么神呐QAQ 我们要求出最小字符串长度 我们设一个\(dp[i]\)表示前\(i\)个字符最后所形成的最短字符串长度 对于第\(i\)个字符,要么保留,就是 ...
- BZOJ 2121: 字符串游戏 区间DP + 思维
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- BZOJ#2121. 字符串游戏 [区间dp]
// powered by c++11 // by Isaunoya #include<bits/stdc++.h> #define rep(i , x , y) for(register ...
- 【BZOJ-1090】字符串折叠 区间DP + Hash
1090: [SCOI2003]字符串折叠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1127 Solved: 737[Submit][Stat ...
- BZOJ2121 字符串游戏
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其 他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- 洛谷P4302 [SCOI2003]字符串折叠(区间dp)
题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...
- 洛谷P4302 [SCOI]字符串折叠 [字符串,区间DP]
题目传送门 字符串折叠 题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如 ...
- [SCOI2003]字符串折叠 (区间DP)
题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...
随机推荐
- 21045234黄斐《java程序设计》第四周
教材学习内容总结 第六章部分 - 继承与多态 何谓继承 继承面向对象中,子类继承父类,避免重复的行为定义.一般来说,父类的父类也称父类,且同一个子类只允许拥有一个父类,而同一个父类则可以拥有多个子类. ...
- 考研编程练习----Kruskal
#include <stdio.h> #include <stdlib.h> #define MAX 100 /* 定义边(x,y),权为w */ typedef st ...
- 跨域发送HTTP请求详解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述几种跨域发HTTP请求的几种方法,POST请求,GET请求 目录: 一,采用JsonP的方式(只能 ...
- nginx基础配置加基础实战演示
目录 基本配置 设置用户 工作衍生进程数 错误日志存放路径 pid文件存放路径 设置最大连接数 http->server gzip 字符编码 nginx的基本格式 实战配置 虚拟主机配置 开始配 ...
- Siki_Unity_2-2_NGUI_UI插件学习(3.6.8版本)(未学)
Unity 2-2 NGUI UI插件学习(3.6.8版本)(未学)
- Laya 自适应 不拉伸处理
Laya.init(640, Laya.Browser.width / 640 * 1028, WebGL); Laya.stage.scaleMode = "fixedwidth" ...
- idea 临时文件
idea可以直接创建一个 scratch file (mac os快捷键 cmd+shift+n) 在里面可以自由的编辑文档, 配合vim使用很方便, 我使用的频率还比较高. 大概是这样的. 这个临时 ...
- 不相交集合ADT -数据结构(C语言实现)
读数据结构与算法分析 不相交集合 等价关系 满足三个性质 - 自反性 - 对称性 - 传递性 基本数据结构 基本思路 使用一个数组,下标表示该集合,内容表示指向的父亲 实现 类型声明 typedef ...
- Laxcus大数据操作系统2.0(5)- 第二章 数据组织
第二章 数据组织 在数据的组织结构设计上,Laxcus严格遵循数据和数据描述分离的原则,这个理念与关系数据库完全一致.在此基础上,为了保证大规模数据存取和计算的需要,我们设计了大量新的数据处理技术.同 ...
- 【Python入门学习】闭包&装饰器&开放封闭原则
1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...