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的更多相关文章

  1. 洛谷P4590 [TJOI2018]游园会(状压dp LCS)

    题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...

  2. P4590-[TJOI2018]游园会【dp套dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...

  3. [模板] dp套dp && bzoj5336: [TJOI2018]party

    Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...

  4. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...

  5. DP套DP

    DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...

  6. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  7. Codeforces 372B Counting Rectangles is Fun:dp套dp

    题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ...

  8. 【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 ...

  9. codeforces 979E(dp套dp)

    题意: 有n个点,编号为1~n.有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂.你还可以连一些边,但这些边一定是从小编号连到大编号的点. 对于一个确定的图,我们去统计有多少条路径满足“该路径经过 ...

随机推荐

  1. embedded database (H2, HSQL or Derby), please put it on the classpath

    Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded data ...

  2. POJ 1852 Ants(贪心)

    POJ 1852 Ants 题目大意 有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂蚁相遇会掉头反向运动,让你求出所有蚂蚁都·掉下木棍的最 ...

  3. 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)

    原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...

  4. 线下---复习day04

    目录 1 Django与Ajax 2分页器组件 3 forms组件 4cookie与session组件 5中间件组件 6Auth模块 作业: 1 Django与Ajax # 通过ajax向https: ...

  5. 动手实现一个简单的 rpc 框架到入门 grpc (上)

    rpc 全称 Remote Procedure Call 远程过程调用,即调用远程方法.我们调用当前进程中的方法时很简单,但是想要调用不同进程,甚至不同主机.不同语言中的方法时就需要借助 rpc 来实 ...

  6. day05总结

    """ echo  "了不起的 [陈少] " 输出结果:   了不起的陈少! ! ! """ ""& ...

  7. day32 异常处理、网络编程

    目录 一.异常处理 1 什么是异常 2 为什么要处理异常 3 如何处理异常 3.1 语法错误 3.2 逻辑错误 3.3 两种处理逻辑异常的方式 3.3.1 可预知型错误 3.3.2 不可预知型错误 4 ...

  8. day15 名称空间与作用域

    目录 一.参数补充 1 命名关键字参数(了解) 二.名称空间 1.内置名称空间 2.全局名称空间 3.局部名称空间 4.名称空间的加载与销毁顺序 三.作用域 一.参数补充 1 命名关键字参数(了解) ...

  9. Scala 面向对象(七):静态属性和静态方法

    1 Scala中静态的概念-伴生对象 Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念). 但是为了能够和Java语言交互(因为Java中有静态概 ...

  10. redis(二十三):Redis 集群(proxy 型)二

    redis的确是一个非常高效的缓存服务器,但是单台redis服务器的内存管理能力有限,如果一味的加大内存的话会导致redis服务器的性能下降,所以就必须要搭建redis集群来提供服务.在redis官方 ...