BZOJ 2121: 字符串游戏
来源:互联网 发布:sql having 编辑:程序博客网 时间:2024/06/06 03:00
这道题太腻害辣。。我太菜了想不出来。。
看了题解之后 还是有点懵。。 你们可以去看看这位大神的 点击打开链接
首先 我们定义状态 f[i][j][k][l]表示字符串区间[i,j]匹配到第k个小串的第l位 当你的l==len[k]的时候就表示i到j这一段可以消掉了 v[i][j]表示i到j是否可以删掉
然后 显然是会爆空间的 不难发现 数组是bool数组 我们可以压位 我把k这一维压了 于是就有f[i][j][l]的二进制值表示可以匹配到哪些字符串的第l位 就可以 当前位是否等于某l位 从f[i][j-1][l-1]来转移。或者v[j][k]就可以 f[i][k][l]|=f[i][j-1][l]
其实i的这一维在dp中就可以省掉了 i并没有什么卵用。。
最后在通过v数组n^2搞一遍就好了
有什么不明白具体看代码。。
用lowbit省时间 居然84ms排11 233333
#include<bits/stdc++.h>#define me(a,x) memset(a,x,sizeof a)using namespace std;const int N=152,M=32,L=22;char c[N],s[M][L]; bool v[N][N];int f[N][L],g[N],p[4321],l[M],q;int main(){ int i,j,k,e,x,n,m; scanf("%s%d",c+1,&m); n=strlen(c+1); for(i=1;i<=m;i++)scanf("%s",s[i]+1),l[i]=strlen(s[i]+1),q=max(q,l[i]); for(i=1;i<=m;i++)p[(1<<i)%4321]=i; for(i=n;i>0;i--) { me(f,0); f[i-1][0]=(1<<(m+1))-1; for(j=i;j<=n;j++) { for(e=1;e<=q;e++)for(x=f[j-1][e-1];x;x-=x&(-x)) { k=p[(x&(-x))%4321]; if(s[k][e]==c[j])f[j][e]|=1<<k; } for(k=j;k<=n;k++)if(v[j][k]) for(e=0;e<=q;e++)f[k][e]|=f[j-1][e]; } for(j=i;j<=n;j++)for(k=1;k<=m;k++) if(f[j][l[k]]&(1<<k)){v[i][j]=1; break;} } for(i=1;i<=n;i++) { g[i]=g[i-1]+1; for(j=1;j<=i;j++)if(v[j][i])g[i]=min(g[i],g[j-1]); } printf("%d\n",g[n]); return 0;}
1 0
- bzoj 2121: 字符串游戏
- bzoj 2121 字符串游戏
- BZOJ 2121: 字符串游戏
- BZOJ 2121 字符串游戏
- bzoj 2121: 字符串游戏 (字符串dp)
- bzoj 2121 字符串游戏(字符串dp)
- bzoj 2121: 字符串游戏 动态规划
- 【bzoj 2121】字符串游戏 (dp)
- 游戏 BZOJ
- [bzoj][SCOI2009]游戏
- bzoj 分裂游戏
- BZOJ 1854 游戏
- BZOJ 1025: [SCOI2009]游戏
- BZOJ 1025: [SCOI2009]游戏
- bzoj 1854: [Scoi2010]游戏
- 【bzoj 1025】: [SCOI2009]游戏
- 【BZOJ 1025】 [SCOI2009]游戏
- 【BZOJ 1854】 [Scoi2010]游戏
- 快速排序 的原理及其java实现(递归与非递归)
- 如何使用JMeter记录测试场景
- fastdex加快apk生成
- ch7-输入与输出
- 富态文本框--小例 ---UMEditor
- BZOJ 2121: 字符串游戏
- 任务之间的通讯与同步
- (基本概念,全文字,太多)编译型解释型,强型非强型,动态静态语言区别
- 无法启动程序 系统找不到指定的exe文件
- Linux内核0.11版本sched.c中sleep_on()函数分析
- 文章标题
- [李景山php]每天laravel-简单的运行流程
- jsp乱码问题解决
- bzoj 4659: Lcm (反演)