2883 -- 【TJOI2018】游园会
Description
小豆参加了\(NOI\)的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是\(N,O,I\)的字样。在会场。上他收集到了\(K\)个奖章组成的串。兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。现在已知兑奖串长度为N,并且在兑奖串上不会出现连续三个奖章为\(NOI\),即奖章中不会出现子串\(NOI\)。现在小豆想知道各个奖励等级会对应多少个不同的合法兑奖串。
Input
第一行两个数,\(N,K\)分别代表兑奖串的长度,小豆收集的奖章串的长度。\((N≤1000,K≤15)\)
第二行一共K个字符,表示小豆得到奖章串。
Output
一共\(K+1\)行,第行表示小豆最后奖励等级为\(i−1\)的不同的合法兑奖串的个数,可能这个数会很大,结果对\(10^9+7\)取模。
Sample Input
3 2
NO
Sample Output
1
19
6
\(DP\)维护\(DP\)。这是个比较套路的题,然后我套路不够深...
首先我们会想到这是否是个计数类\(DP\)。然后我们就会想\(DP\)的状态应该能表示出\(LCS\)的值。然而我们需要将每个位置的\(LCS\)值记下来才能得到下一个状态的完整的\(DP\)值。
注意到\(K\)很小,所以我们就记录下在奖章串上每个位置的\(DP\)值就行了。
相邻的\(DP\)值最多差\(1\),所以我们状压,记录每个位置的\(DP\)值是否比前一个位置的大就行了。
类似的题我记得还做过一个要维护最长上升子序列的题,方法类似,就是维护每个元素是否出现在单调栈中。
#include<bits/stdc++.h>
#define ll long long
#define N 1005
#define M 16
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
const ll mod=1e9+7;
char s[100];
int f[1<<M][4],g[1<<M][4];
int to[4][4];
char c[]={'N','O','I'};
int trans[1<<M][4];
void out(int S) {for(int i=0;i<m;i++) cout<<(S>>i&1);}
void pre() {
static int f[M],g[M];
for(int S=0;S<(1<<m);S++) {
for(int k=0;k<m;k++) f[k+1]=f[k]+(S>>k&1);
for(int j=0;j<=2;j++) {
for(int k=1;k<=m;k++) {
g[k]=max(g[k-1],f[k]);
if(c[j]==s[k]) g[k]=max(g[k],f[k-1]+(c[j]==s[k]));
}
int T=0;
for(int k=1;k<=m;k++) if(g[k]>g[k-1]) T|=1<<k-1;
trans[S][j]=T;
}
}
}
int ans[M];
int main() {
n=Get(),m=Get();
scanf("%s",s+1);
for(int i=0;i<=2;i++) to[i][0]=1;
to[1][1]=2;
pre();
f[0][0]=1;
for(int i=0;i<n;i++) {
memset(g,0,sizeof(g));
for(int S=0;S<(1<<m);S++) {
for(int j=0;j<=2;j++) {
for(int now=0;now<=2;now++) {
if(now==2&&j==2) continue ;
if(!f[S][j]) continue ;
(g[trans[S][now]][to[j][now]]+=f[S][j])%=mod;
}
}
}
memcpy(f,g,sizeof(f));
}
for(int S=0;S<(1<<m);S++) {
int len=0;
for(int j=0;j<m;j++) len+=(S>>j&1);
for(int j=0;j<=2;j++) (ans[len]+=f[S][j])%=mod;
}
for(int i=0;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}
2883 -- 【TJOI2018】游园会的更多相关文章
- 洛谷P4590 [TJOI2018]游园会(状压dp LCS)
题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...
- BZOJ5336:[TJOI2018]游园会——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5336 https://www.luogu.org/problemnew/show/P4590 小豆 ...
- luogu P4590 [TJOI2018]游园会 dp套dp
LINK:游园会 容易想到 设\(f[i][j][k][l]\)前i个字符 j表示状压的w个字符状态为j 长度<=k 匹配到了NOI的第l个位置的方案数. 不过只能得到30分. 考虑优化 其实优 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- hs-black 杂题选讲
[POI2011]OKR-Periodicity 考虑递归地构造,设 \(\text{solve(s)}\) 表示字典序最小的,\(\text{border}\) 集合和 \(S\) 的 \(\tex ...
- BZOJ5336 TJOI2018 party 【状压DP】*
BZOJ5336 TJOI2018 party Description 小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是N, O, I的字样.在会场上他收集到了K个奖章组成 ...
- hdu 2883 kebab 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2883 Almost everyone likes kebabs nowadays (Here a ke ...
- bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec ...
- [模板] dp套dp && bzoj5336: [TJOI2018]party
Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...
随机推荐
- tomcat和jdk版本兼容(Tomcat版本要比jdk高)
用的tomcat是低版本的,但是用的jdk却是高版本的,用Servlet做的项目运行都没有问题,但是直接运行jsp却死活都运行失败. 最后发现是tomcat和jdk的版本问题造成的. 总结如下: to ...
- ASP.NET MVC 学习笔记-6.异步控制器
1) 异步控制器的由来 对于IIS,它维护了一个.NET线程池来处理客户端请求,这个线程池称为工作线程池,其中的线程称为工作线程.当IIS接收到一个请求时,需要从工作线程池中唤醒一个工 ...
- sql语句求百分比
此sql语句包括了两个聚合函数做除法求百分比,并保留两位小数,直接输出字符串形式的百分比.以及对case when在聚合函数的应用. SELECT ss.SS_NAME,SS_ID, COUNT(ea ...
- struts2_项目运行报404
1.缺少jar包,commons-lang3-3.2.jar 参考网址:https://blog.csdn.net/u013457382/article/details/50972401 2.stru ...
- jQuery中$.ajax()方法参数解析
本文实例为大家讲解了jQuery $.ajax()方法参数,供大家参考,具体内容如下 $.ajax({ url:'test.do', data:{id:123,name:'xiaoming'}, ty ...
- nodemailer + express + h5 拖拽文件上传 实现发送邮件
一.部署 1.部署Express 2.准备一个邮箱并开始SMTP服务 二.服务器端 三.客户端 四.效果:
- jQuery效果之jQuery实现图片的依次加载图片
css代码: ;;} ul#portfolio li{float: left;margin:0 5px 0 0;width:250px;height: 250px;list-style: none;} ...
- openEntityForm如何给关于(regardingobjectid)类型查找字段赋值?
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复264或者20170924可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Linux 安装 jdk8
切换目录 cd /usr 创建目录 mkdir java cd java 下载 jdk rz 或者 ftp 都行,只要能成功上传 解压 tar zxvf jdk-8u181-linux-x64.tar ...
- 索引堆(Index Heap)
首先我们先来看一个由普通数组构建的普通堆. 然后我们通过前面的方法对它进行堆化(heapify),将其构建为最大堆. 结果是这样的: 对于我们所关心的这个数组而言,数组中的元素位置发生了改变.正是因为 ...