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. PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击!

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第27文章,我们一起来聊聊数据处理领域的降维(dimensionality reduction)算法. 我们都知道,图片 ...

  2. 从上到下打印二叉树(剑指offer-22)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目解析 使用队列来进行层次遍历,本质上就是宽搜. 题目解答 import java.util.*; /** public class ...

  3. 小程序checkbox-group只获取到一个值

    wx:for循环不能写在checkbox-group标签上 wx:for循环不能写在checkbox-group标签上 wx:for循环不能写在checkbox-group标签上 wx:for循环不能 ...

  4. CentOS7.7 安装并配置JDK 1.8

    本文介绍如何在CentOS中安装oracleJDK1.8并配置环境变量 1.下载并安装jdk1.8 进入下载页:https://www.oracle.com/technetwork/java/java ...

  5. about 蛤蛤

    蛤蛤属于蛤蛤门(haha),蛤蛤纲(haha),蛤蛤亚纲(haha),蛤蛤目(haha),蛤蛤总科(haha),蛤蛤科(haha).

  6. 浅析Python垃圾回收机制!

    Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...

  7. classpath路径(转)

    src不是classpath, WEB-INF/classes,lib才是classpathWEB-INF/ 是资源目录, 客户端不能直接访问, 这话是没错,不过现在的IDE编译器在编译时会把src下 ...

  8. Python之函数、递归、内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  9. Log4net控制台和窗体程序无法输出记录的原因之一

    在asp.net web应用程序中,读取log4net的配置文件可以这样写: [assembly:log4net.Config.XmlConfigurator(ConfigFile="Web ...

  10. Visual SVN Server+TortoiseSVN进行源代码管理

    安装VisualSVN Server 安装完之后,可配置SVN Server的IP地址,右键下图红色部分,选择属性,然后可配置ServeName和IP Address 之后可以创建用户.用户组和项目库 ...