luogu P4590 [TJOI2018]游园会 dp套dp
LINK:游园会
容易想到 设\(f[i][j][k][l]\)前i个字符 j表示状压的w个字符状态为j 长度<=k 匹配到了NOI的第l个位置的方案数.
不过只能得到30分。
考虑优化 其实优化就只能优化如何快速得到LCS 这个问题 \(3^15\cdot 15\)的状态量无法很难接受。
考虑降低这个状态量。考虑如果在一个自动机上 那么我们这个状态就可以表示匹配到了自动机上某个节点。
不过最长公共子序列自动机 并不存在。
考虑人为构造这个东西 考虑求两个串的最长公共子序列的dp.
\(dp_{i,j}\)表示A串前i个字符B串前j个字符的最大长度.
容易得到转移:\(dp_{i,j}=max(dp_{i-1,j},dp{i,j-1},dp_{i-1,j-1}+[A_i==B_j])\)
那么其实只要知道\(dp_i-1\)这个数组和当前这个字符\(A_i\)就可以推向下一个字符。
进一步的 以\(dp_i\)为最长公共子序列的节点 那么每次转移只需要枚举下一个字符是谁 就可以很容易的重新得到新的LCS的状态和长度.
这样就可以把上述的那么大的状态量压缩成了这样的dp数组 不过直接存一个数组是需要hash的。
可以观察得到 \(dp_i\)是不降的 可以将其差分就得到了一个二进制串 最终状态量为\(2^w\) 可以通过此题.
const int MAXN=1010,maxn=35010;
int n,k,u,maxx;
int f[2][maxn][3];
char a[MAXN];
int g[2][MAXN],sum[maxn],ans[MAXN];
inline void add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
inline void jy(int s)
{
rep(1,k,i)g[0][i]=s>>i-1&1;
rep(1,k,i)g[0][i]+=g[0][i-1];
}
inline int ys()
{
int S=0;
rep(1,k,i)if(g[1][i]-g[1][i-1])S|=1<<(i-1);
return S;
}
inline void update(int s,int l,char c,int w)
{
jy(s);
rep(1,k,i)
{
g[1][i]=max(g[0][i],g[1][i-1]);
if(c==a[i])g[1][i]=max(g[1][i],g[0][i-1]+1);
}
int j=ys();add(f[u][j][l],w);
}
int main()
{
freopen("1.in","r",stdin);
gt(n);gt(k);gc(a);
maxx=1<<k;--maxx;
f[u][0][0]=1;
rep(1,n,i)
{
u=u^1;
rep(0,maxx,j)rep(0,2,k)f[u][j][k]=0;
rep(0,maxx,j)
{
if(f[u^1][j][0])
{
update(j,1,'N',f[u^1][j][0]);
update(j,0,'O',f[u^1][j][0]);
update(j,0,'I',f[u^1][j][0]);
}
if(f[u^1][j][1])
{
update(j,1,'N',f[u^1][j][1]);
update(j,2,'O',f[u^1][j][1]);
update(j,0,'I',f[u^1][j][1]);
}
if(f[u^1][j][2])
{
update(j,1,'N',f[u^1][j][2]);
update(j,0,'O',f[u^1][j][2]);
}
}
}
rep(0,maxx,i)
{
sum[i]=sum[i>>1]+(i&1);
rep(0,2,j)add(ans[sum[i]],f[u][i][j]);
}
rep(0,k,i)put(ans[i]);
return 0;
}
luogu P4590 [TJOI2018]游园会 dp套dp的更多相关文章
- 洛谷P4590 [TJOI2018]游园会(状压dp LCS)
题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...
- P4590-[TJOI2018]游园会【dp套dp】
正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...
- [模板] dp套dp && bzoj5336: [TJOI2018]party
Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...
- luogu 4158 粉刷匠 dp套dp
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...
- DP套DP
DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...
- bzoj 3864: Hero meet devil [dp套dp]
3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...
- Codeforces 372B Counting Rectangles is Fun:dp套dp
题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ...
- 【BZOJ3864】Hero meet devil DP套DP
[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...
- codeforces 979E(dp套dp)
题意: 有n个点,编号为1~n.有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂.你还可以连一些边,但这些边一定是从小编号连到大编号的点. 对于一个确定的图,我们去统计有多少条路径满足“该路径经过 ...
随机推荐
- 给大家分享一下less的使用几个技巧
1.层级关系 让这个box范围内的全部包进来,这样的话就完美的进行调节,再也不用到处找第几行第几个,我刚才在哪个位置给覆盖了.一看便知! .box{ width: %; height: 300px; ...
- 前端开发-css
css: 是给html标签装饰的,变得更好看. 注释: 单行注释:/*注释内容*/ 多行注释:/* 注释内容 注释内容 注释内容 */ 通常我们在写css代码时也会用注释来划分区域(html代码多,同 ...
- mysql无法启动服务,错误1067
安装mysql,提示安装成功后,启动服务,提示错误1067 前情提示:mysql安装文件和配置文件没有放在Program File文件夹下. 解决办法:将my.ini文件剪切放在Program Fil ...
- 简单讲解一下http2的多路复用
在 HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然 ...
- Mysql基础(十):MYSQL中使用事务的案例
https://www.cnblogs.com/lsqbk/p/10145306.html 基本介绍 事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败 ...
- Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...
- 【C#】WebService接受跨域请求及返回json数据
问题概述 通过Web Service发布服务供客户端调用是一种非常简单.方便.快速的手段,并且服务发布后会有一个服务说明页面,直观明了,如图: 一般情况下,在web页面中的JavaScript中调用W ...
- bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&&bzoj1630[Usaco2007 Demo]Ant Counting*
bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有 ...
- easyUI时间控件
##=============================JSP======================================<div class="labelw l ...
- Flarum 的安装与配置
Flarum 是一款非常棒的开源论坛程序,本鸽子的论坛 就是用 Flarum 搭建的.之前有人问过我 Flarum 如何搭建,所以下面讲一下 Flarum 的搭建过程. 前提 域名需要提前解析. 有一 ...