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.有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂.你还可以连一些边,但这些边一定是从小编号连到大编号的点. 对于一个确定的图,我们去统计有多少条路径满足“该路径经过 ...
随机推荐
- Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...
- Emergency Evacuation,题解
题目: 题意: 在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例). 分析: 首先,我们先考虑简单的,只考虑出口前有什么事件发生:1. ...
- SpringBoot2.x入门:应用打包与启动
前提 这篇文章是<SpringBoot2.x入门>专辑的第5篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 这篇文章分析一个偏向于运维方面的内容: ...
- day05 程序与用户交互和基本运算符
程序与用户交互和基本运算符 目录 程序与用户交互和基本运算符 1.程序与用户交互 1.1什么是与用户交互 1.2为什么要与用户交互 1.3如何与用户交互 1.3.1格式化输出 2基本运算符 2.1算数 ...
- Python模块01/自定义模块/time模块/datetime模块/random模块
Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ...
- Hangfire实战(一)------Hangfire+SQL Server实现简单的任务调度
Hangfire:一个开源的任务调度框架 开发环境:VS2017,SQL Server 2012,.NET Framework 4.5 项目类型:控制台应用程序 1.在vs的程序包控制台中为项目添加H ...
- 1731: [Usaco2005 dec]Layout 排队布局*
1731: [Usaco2005 dec]Layout 排队布局 题意: n头奶牛在数轴上,不同奶牛可以在同个位置处,编号小的奶牛必须在前面.m条关系,一种是两头奶牛距离必须超过d,一种是两头奶牛距离 ...
- 适用于IE8浏览器的bootsarp下拉菜单(支持多选,全选)
html部分代码,引用及整体项目Github项目地址:https://github.com/CNbozi/combobox 1 <!DOCTYPE html> <html lang= ...
- Mysql UDF提权方法
0x01 UDF UDF(user defined function)用户自定义函数,是mysql的一个拓展接口.用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sq ...