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. 每天一个Linux命令(44)crontab命令

        crontab命令被用来提交和管理用户需要周期性执行的任务,与windows下的计划任务类似.     (1)用法:     用法: crontab  [-u user]  file cron ...

  2. Linux软件包管理 RMP包管理

    概述 RPM 包的命名一般都会遵守统一的命名规则,例如: httpd-2.2.15-15.el6.centos.1.i686.rpm 其中的各项代表的含义如下: httpd:软件包名. 2.2.15: ...

  3. Raspberry Pi开发之旅-土壤湿度检测

    一.土壤传感器 传感器四个针脚:  针脚 含义 AO 模拟信号输出 DO 数字信号输出 GND 电源负极 VCC 电源正极 二.接线 YL-38和YL69 之间直接用2根母对母线连接. YL-38和树 ...

  4. Qt开发动画

    #include <QPropertyAnimation> #include <QDesktopWidget> //下坠 void MainWindow::on_pushBut ...

  5. iBatis的Settings节点参数详解[转]

    (1) cacheModelsEnabled: 是否启用SqlMapClient上的缓存机制.建议设为"true".默认值为“true”. (2) enhancementEnabl ...

  6. MySql数据库的主从配置

    主服务器 192.168.7.182 Centos6.5 MYSQL5.6.10 从服务器 192.168.112.7 Centos6.5 MYSQL5.6.10 主服务器配置(192.168.7.1 ...

  7. springmvc中url-url-pattern /和/*的区别

    在使用springmvc时,都会在web.xml中配置一个dispatchservlet,如下: <listener> <listener-class> org.springf ...

  8. volatile的特性

    volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这 ...

  9. linux系统内SAMBA共享问题

    最近将项目迁移到了公司服务器上,以后客户端调试和服务端开发都要去链接这台服务器,但是开发就需要调试,也需要log信息,同一局域网内,如何链接服务器并随时查看服务器上的log信息呢? 今天搞了一下,把步 ...

  10. vue v-if with v-for

    遍历和条件判断混合使用示例. <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...