【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 = ...
随机推荐
- 苏州Uber优步司机奖励政策(4月18日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- MySQL主从失败报错误: Got fatal error 1236
一.问题原因及报错误信息 由于MySQL主库意外重启,导致从库无法同步报错如下: 登录从库查看主从同步的错误信息 [root@--- mysql]# vim mysqld-error.log -- : ...
- sqlserver 导出数据到Excel
1.导出非正式Excel EXEC master..xp_cmdshell 'bcp t.dbo.tcad out D:\MySelf\output\Temp.xls -c -q -S".& ...
- AngularJS中Directive指令系列 - 基本用法
参考: https://docs.angularjs.org/api/ng/service/$compile http://www.zouyesheng.com/angular.html Direct ...
- 阿里云Ubuntu 14.04 + Nginx + .net core + MySql
前段时间帮朋友写了一个网站,现在做一个记录. .Net Core 安装: curl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...
- shell loop
#!/bin/sh date i=0 while [ $i -le 30 ] do echi $i /usr/sbin/r2/np_test_acl -f rule.txt i=$(e ...
- hdu2065"红色病毒"问题(指数母函数+快速幂取模)
"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Python字符串/元祖/列表/字典互转
#-*- coding:UTF-8 -*- #author:RXS002 #1.字典 dict = {'name':'Zara','age':7,'class':'First'} #字典转换为字符串, ...
- windows更改MySQL存储路径
在C:\ProgramData\MySQL\MySQL Server 5.7文件夹 my.ini是默认的配置文件.在这里我们只更改数据存储路径.不更改配置文件 1 # Path to the data ...
- linux下各文件夹的结构说明及用途介绍(转载)
详细介绍文档 转载文章路径 /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录的基点,比如用户 ...