Description

Problem 5336. -- [TJOI2018]party

Solution

神奇的dp套dp...

考虑lcs的转移方程:

\[lcs[i][j]=\begin{cases} lcs[i-1][j-1]+1 & (t[i]==s[j]) \\ \max (lcs[i-1][j],lcs[i][j-1]) \end{cases}
\]

我们发现 \(lcs[i][j]-lcs[i][j-1] \le 1\),而且\(\left| S \right| \le 15\)

所以我们可以对lcs[i]差分之后状压到一个数\(a\).

先不考虑连续NOI的限制.

设dp[i][a]表示兑奖串长为i,且lcs[i]=a的方案数.

那么我们可以转移:

\[\begin{cases} dp[0][0]=1 \\ dp[i][a]=\sum\limits_{c=1}^3 dp[i-1][trans[a][c]] \end{cases}
\]

其中trans[a][c]表示a状态(lcs[i])加上字符c的状态(lcs[i+1]), 这个可以先解码出原lcs数组的值, 再像普通lcs一样维护, 再编码回去.

另外就是细节:

  • 串中没有连续的NOI: dp数组加一维即可
  • 卡空间, 滚动数组

详见代码.

Code

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll; //---------------------------------------
const int nsz=1050,ksz=20,k2sz=4e4,nmod=1e9+7;
int n,k,bnd,line[ksz],ans[ksz];
char s[ksz]; int ne[4]{0,1,2,3};
int dp[2][k2sz][3],cur=1;//0:x 1:1 2:12
int trans[k2sz][4],cnt1[k2sz]; int val[2][ksz];
int sol1(int st,int c){//res=st+c
rep(i,1,k)val[0][i]=val[0][i-1]+((st>>(i-1))&1);
rep(i,1,k){
if(c==line[i])val[1][i]=val[0][i-1]+1;
else val[1][i]=max(val[0][i],val[1][i-1]);
}
int res=0;
rep(i,1,k)res|=((val[1][i]-val[1][i-1])<<(i-1));
return res;
}
void add(int &a,int b){a=(a+b)%nmod;}
void sol(){
//init
bnd=(1<<k)-1;
rep(i,0,bnd){
if(i)cnt1[i]=cnt1[i&(i-1)]+1;
rep(j,1,3)trans[i][j]=sol1(i,j);
}
dp[cur][0][0]=1;
rep(i,1,n){
cur^=1;
memset(dp[cur],0,sizeof(dp[cur]));
rep(j,0,bnd){
rep(a,0,2){//dp[cur^1][j][a]
if(a!=2)add(dp[cur][trans[j][ne[a+1]]][a+1],dp[cur^1][j][a]);
if(a!=0)add(dp[cur][trans[j][1]][1],dp[cur^1][j][a]);
rep(c,2,3){
if(c==ne[a+1])continue;
add(dp[cur][trans[j][c]][0],dp[cur^1][j][a]);
}
}
}
}
rep(i,0,bnd){
rep(j,0,2){
add(ans[cnt1[i]],dp[cur][i][j]);
}
}
} int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>k>>(s+1);
rep(i,1,k)line[i]=(s[i]=='N'?1:s[i]=='O'?2:3);
sol();
rep(i,0,k)cout<<ans[i]<<'\n';
return 0;
}

[模板] dp套dp && bzoj5336: [TJOI2018]party的更多相关文章

  1. DP套DP

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

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

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

  3. luogu 4158 粉刷匠 dp套dp

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

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

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

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

  6. codeforces 979E(dp套dp)

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

  7. dp 套 dp扯谈

    1.[扯谈概念] \(dp\) 套 \(dp\) 其实也就是 \(dp\) . 这里就定义下面两个概念: 内层 \(dp\) 表示的是被套在里面的那个 \(dp\) 外层 \(dp\) 表示的是最外面 ...

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

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

  9. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

随机推荐

  1. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  2. 熟悉常用的HBase操作,编写MapReduce作业

    1. 以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 学生表(Student) 学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age) 201 ...

  3. HTML5移动端拖动惯性

    下面代码只是实现了上下滑动惯性,没有写水平滑动惯性.(临时代码笔记,可能会在以后的过程中不断更新优化代码) /** * 惯性原理: * 产生的速度 = 移动距离 / 移动时间 * 距离 = 松开的坐标 ...

  4. 上传漏洞总结-upload-labs

    介绍: Upload-labs是一个所有类型的上传漏洞的靶场 项目地址:https://github.com/c0ny1/upload-labs 思维导图: 小试牛刀: Pass-01 客户端js检查 ...

  5. 谷歌AI涉足艺术、太空、外科手术,再强调AI七原则

    谷歌AI涉足艺术.太空.外科手术,再强调AI七原则 https://mp.weixin.qq.com/s/MJG_SvKCEBKRvL3IWpL0bA 9月18日上午,Google在上海的2018世界 ...

  6. EFCore使用JSON_VALUE查询json对象的值

    EFCore使用JSON_VALUE查询json对象的值 Intro SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍 ...

  7. git上传新项目到coding

    1:coding.net注册账号,并创建项目.可以将readme.txt打上勾 2:cd到本机的项目文件夹下 在git中代表workspace 3:mac用户用ls -all ,linux用户用ll ...

  8. asp.net core 2.1 部署 centos7

    asp.net core 2.1 部署 centos7 Kestrel 非常适合从 ASP.NET Core 提供动态内容. 但是,Web 服务功能不像服务器(如 IIS.Apache 或 Nginx ...

  9. 一文把samba相关的都说清楚

    1.前言 samba源码都一样,配置也也一样,各个不同linux版本,唯一不同的是对服务的启动方式不同.下面以ubuntu14.4为例,说明. 2. 安装samba samba的安装,可以源码安装,大 ...

  10. centos7中/tmp文件保存天数

    不要在/tmp目录下保存文件,该目录会定期清理文件 /tmp默认保存10天 /var/tmp默认保存30天 配置文件:/usr/lib/tmpfiles.d/tmp.conf 默认配置文件:# Thi ...