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 ...
随机推荐
- linux c++ 实现http请求
main.cpp #include HttpReq.h #include <string.h> int main(void) { HttpRequest* Http; char http_ ...
- BadUsb简单用法示例
所需硬件 badusb 自行淘宝 驱动程序会自动安装,若未自动安装自行百度 所需工具 arduino-1.5.5-r2用于编辑代码并上传至badusb badusb连接至电脑 打开ard ...
- CMDB 理论
TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Comput ...
- 配置Bean的作用域
一.Spring中Bean的5个作用域 在Spring 2.0及之后的版本中,Bean的作用域被划分为5种.如下 singleton 默认值.以单例模式创建Bean的实例,即容器中该Bean的实例只 ...
- jQuery-点击按钮页面滚动到顶部,底部,指定位置
$('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);}); //页面滚动至顶部 $('. ...
- python 利用 smtplib发邮件
import smtplib from email.mime.text import MIMEText title = "request build error" content ...
- 6-4 如何构建xml文档
>>> from xml.etree.ElementTree import Element,ElementTree Element 是节点元素 ElementTree是由 Eleme ...
- Almost Increasing Array CodeForces - 946G (dp)
大意: 定义几乎递增序列为删除不超过一个数后序列严格递增. 给定序列, 求最少改变多少个数能变为几乎递增序列. 跟hdu5256类似,
- python 路径操作工具 pathlib,比 os 模块好用太多
在 python 当中,如果你想控制路径,基本上绕不开 os.path.我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误. pathlib 相对 ...
- c#HtmlAgilityPack解析html
通过HtmlAgilityPack实现对html页面解析HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var itemLis ...