BZOJ5336: [TJOI2018]party

https://lydsy.com/JudgeOnline/problem.php?id=5336

分析:

  • 好题。
  • 正常的思路是设\(f[i][j][0/1/2]\)表示前\(i\)个位置,与奖章串的\(lcs\)状态为\(j\),匹配到\(NOI\)的第几位,然后转移。
  • 那么问题是这个\(lcs\)的状态如何存储,打个表发现这个状态数很少,实际上也是这样的,因为在匹配\(lcs\)的过程中,相邻两位\(dp\)值最多差\(1\),状态数\(2^k\)。
  • 然后就做完了,预处理出来每个状态能转移到的状态即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 1050
#define mod 1000000007
char w[N];
int n,K;
typedef long long ll;
int tr[1<<15][3],sf[N],sg[N],cnt[1<<15];
ll f[2][1<<15][3],ans[N];
inline void upd(ll &x,ll y) {
x=x+y; if(x>=mod) x-=mod;
}
int main() {
scanf("%d%d%s",&n,&K,w+1);
int i,mask=(1<<K)-1,s;
for(s=0;s<=mask;s++) {
for(i=1;i<=K;i++) {
sf[i]=sf[i-1]+((s>>(i-1))&1);
}
for(i=1;i<=K;i++) {
if(w[i]=='N') sg[i]=sf[i-1]+1;
else sg[i]=max(sg[i-1],sf[i]);
tr[s][0]|=(sg[i]-sg[i-1])*(1<<(i-1));
}
for(i=1;i<=K;i++) {
if(w[i]=='O') sg[i]=sf[i-1]+1;
else sg[i]=max(sg[i-1],sf[i]);
tr[s][1]|=(sg[i]-sg[i-1])*(1<<(i-1));
}
for(i=1;i<=K;i++) {
if(w[i]=='I') sg[i]=sf[i-1]+1;
else sg[i]=max(sg[i-1],sf[i]);
tr[s][2]|=(sg[i]-sg[i-1])*(1<<(i-1));
}
}
f[0][0][0]=1;
for(i=0;i<n;i++) {
int i0=i&1,i1=(i+1)&1;
for(s=0;s<=mask;s++) {
//O/I->N
upd(f[i1][tr[s][0]][1],f[i0][s][0]);
//O/I->O
upd(f[i1][tr[s][1]][0],f[i0][s][0]);
//O/I->I
upd(f[i1][tr[s][2]][0],f[i0][s][0]);
//N->N
upd(f[i1][tr[s][0]][1],f[i0][s][1]);
//N->O
upd(f[i1][tr[s][1]][2],f[i0][s][1]);
//N->I
upd(f[i1][tr[s][2]][0],f[i0][s][1]);
//NO->N
upd(f[i1][tr[s][0]][1],f[i0][s][2]);
//NO->O
upd(f[i1][tr[s][1]][0],f[i0][s][2]);
}
memset(f[i0],0,sizeof(f[i0]));
}
for(i=0;i<=mask;i++) cnt[i]=cnt[i>>1]+(i&1);
for(s=0;s<=mask;s++) for(i=0;i<3;i++) upd(ans[cnt[s]],f[n&1][s][i]);
for(i=0;i<=K;i++) printf("%lld\n",ans[i]);
}

BZOJ5336: [TJOI2018]party的更多相关文章

  1. BZOJ5336 TJOI2018 party 【状压DP】*

    BZOJ5336 TJOI2018 party Description 小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是N, O, I的字样.在会场上他收集到了K个奖章组成 ...

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

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

  3. DP套DP

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

  4. 【BZOJ5336】[TJOI2018]party(动态规划)

    [BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j ...

  5. BZOJ5336:[TJOI2018]游园会——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5336 https://www.luogu.org/problemnew/show/P4590 小豆 ...

  6. bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec  ...

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

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

  8. 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)

    [BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...

  9. 【BZOJ5337】[TJOI2018]str(动态规划,哈希)

    [BZOJ5337][TJOI2018]str(动态规划,哈希) 题面 BZOJ 洛谷 题解 就很呆... 显然按层\(dp\),如果能够匹配上就进行转移,直接哈希判断是否能够匹配就好了... #in ...

随机推荐

  1. 07_Warning $HADOOP_HOME is deprecated.去除办法

    Warning $HADOOP_HOME is deprecated.去除办法 警告的出现: 解决方案: 第一种: 去除[/etc/profile]文件中[export HADOOP_HOME=/op ...

  2. OpenSSL for Android

    http://blog.csdn.net/xiongmc/article/details/25736041 OpenSSL1)开源项目Guardian Project试图让Android手机也拥有类似 ...

  3. centos 下安装python3.6.2

    具体详情: http://www.cnblogs.com/vurtne-lu/p/7068521.html

  4. android 修改源码framework后如何编译【转】

    本文转载自:https://blog.csdn.net/fuchengbo000/article/details/43193801 1.如果在framework/base/core/res/res下添 ...

  5. Xshell 5 上传下载插件

    #yum -y install lrzsz #rz 上传 sz用法: 下载一个文件 sz filename 下载多个文件 sz filename1 filename2 下载dir目录下的所有文件,不包 ...

  6. JAVA 写中文字符串到指定文件 中文乱码 问题解决

    之前试过下面代码里面的注释掉的 方法,都不行,后来想到了不如指定编码格式试试,果真可以了. String as= “中文字符”; //byte[] b = as.getBytes(); try{ Fi ...

  7. 【转】数据库获得当前时间getdate()

    CONVERT(nvarchar(10),count_time,121): CONVERT为日期转换函数,一般就是在时间类型 (datetime,smalldatetime)与字符串类型(nchar, ...

  8. hdoj1004--Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  9. 命令行下载Baiduyun files

    源码 步骤1:先拿到一个插件插件地址1,插件地址2 步骤2:解压并保存 下载的文件中,包含了一个Baidu-PCS的文件夹.然后打开我们的资源管理器.将Baidu-PCS随意移动到一个文件目录下,但文 ...

  10. java:Writer/Reader字符流操作

    字符流的操作: 字节流的操作,是直接映射文件的:file->文件 字符流的操作是需要存在缓存区的:file->缓冲区->文件 (中文处理,一般用字符流) public static ...