BZOJ 2121: 字符串游戏 区间DP + 思维
Description
Input
Output
输出一个整数,表示L的最短长度。
比较神仙的动态规划.
定义 $g[l][r][i][j]$ 表示是否可以将区间 $[l,r]$ 删至只剩下第 $i$ 个串的前 $j$ 位 $,$ $f[l][r]$ 表示是否可以将 $[l,r]$ 这个区间全部删除掉,而 $h[i]$ 表示对 $1$~$i$ 操作后保留的最短长度.
如果能知道 $f$,则可得转移 $h[i]=min(h[i],h[j]),f[j+1][i]=1$.
现在关键在于如何求出 $f$ 数组.
按照区间 $dp$ 的方式依次枚举区间长度.
令当前枚举的区间长度为 $len,$ 则:
$g[l][r-1][i][j-1]\Rightarrow g[l][r][i][j],$ 或者 $f[l][k]\&\&g[k+1][r][i][j]$.
转移完当前区间的 $g$ 数组后,就可以依次判断是否可以更新 $f$ 数组了.
这种区间 $dp$ 都挺巧妙的.
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 160
#define setIO(s) freopen(s".in", "r" , stdin)
using namespace std;
int n,m;
char L[N],S[32][N];
int length[N],g[N][N][32][22],f[N][N],h[N];
int main()
{
int i,j,len;
// setIO("input");
scanf("%s%d",L+1,&m),n=strlen(L+1);
for(i=1;i<=m;++i)
{
scanf("%s",S[i]+1),length[i]=strlen(S[i]+1);
for(j=1;j<=n;++j)
{
if(L[j]==S[i][1])
{
g[j][j][i][1]=1;
if(length[i]==1) f[j][j]=1;
}
}
}
for(len=2;len<=n;++len)
{
int l,r,k;
for(l=1;(r=l+len-1)<=n;++l)
{
for(i=1;i<=m;++i)
{
for(j=1;j<=length[i];++j)
if(S[i][j]==L[r])
g[l][r][i][j]|=g[l][r-1][i][j-1];
}
for(i=1;i<=m;++i)
{
for(j=1;j<=length[i];++j)
for(k=l;k<r;++k)
if(g[l][k][i][j]&&f[k+1][r]) g[l][r][i][j]=1;
// g[l][r][i][j]|=(g[l][k][i][j] && f[k+1][r]);
}
for(i=1;i<=m;++i) f[l][r]|=g[l][r][i][length[i]];
}
}
for(i=1;i<=n;++i)
{
h[i]=h[i-1]+1;
for(j=1;j<=i;++j) if(f[j][i]) h[i]=min(h[i], h[j-1]);
}
printf("%d\n",h[n]);
return 0;
}
BZOJ 2121: 字符串游戏 区间DP + 思维的更多相关文章
- BZOJ#2121. 字符串游戏 [区间dp]
// powered by c++11 // by Isaunoya #include<bits/stdc++.h> #define rep(i , x , y) for(register ...
- 【bzoj2121】字符串游戏 区间dp
题目描述 给你一个字符串L和一个字符串集合S,如果S的某个子串在S集合中,那么可以将其删去,剩余的部分拼到一起成为新的L串.问:最后剩下的串长度的最小值. 输入 输入的第一行包含一个字符串,表示L. ...
- BZOJ 1090 字符串折叠(区间DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...
- BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)
2121: 字符串游戏 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 672 Solved: 376[Submit][Status][Discuss ...
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- 【BZOJ-1090】字符串折叠 区间DP + Hash
1090: [SCOI2003]字符串折叠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1127 Solved: 737[Submit][Stat ...
- 洛谷P4302 [SCOI2003]字符串折叠(区间dp)
题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
随机推荐
- 【机器学习】HK算法(LMSE算法) LMS算法改进保证线性可分时均方误差标准能够找到线性可分的超平面
1.其实HK算法思想很朴实,就是在最小均方误差准则下求得权矢量. 他相对于感知器算法的优点在于,他适用于线性可分和非线性可分得情况,对于线性可分的情况,给出最优权矢量,对于非线性可分得情况,能够判别出 ...
- LayaAir疑难杂症之四:laya引擎自动断点到bundle.js文件中且无报错,但程序不再执行
在一次断点调试中,突然程序不再按照博主指定的断点执行,莫名其妙端点到了bundle.js文件中的某一行中,这是不应该的,第一次时间反应就是引擎出了问题,但是总不能让博主卸载重装吧. 经过查找资料,询问 ...
- mysql之general log 日志
开启 general log 将所有到达MySQL Server的SQL语句记录下来. 一般不会开启开功能,因为log的量会非常庞大.但个别情况下可能会临时的开一会儿general log以供排障使用 ...
- 实现 RSA 算法之改进和优化(第三章)(老物)
第三章 如何改进和优化RSA算法 这章呢,我想谈谈在实际应用出现的问题和理解. 由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯.) 在讲第一章 ...
- 关于strcpy的安全函数的选择
1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行.那么我们就可以选择安全 函数:strncpy_s 2)如果在进行字符串拷贝时 ...
- linux命令详解——ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- nacos集群搭建
nacos介绍 Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心).动态配置服务(可以做配置中心).动态 DNS 服务. 1.从官网下载nacos压缩 ...
- AIX用户和组管理
1.用户登录和初始化
- PAT Basic 1081 检查密码 (15 分)
本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输入格式: 输入第一行 ...
- Tensorrt之tf-trt
使用python接口, 另外一种方式就是使用tf-trt,优化后的模型还是pb.优化的过程主要是一些层的合并啊之类的,加速结果不是特别明显,测了两个网络, 加速了10%的样子.优化后仍是pb,因此可以 ...