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. input propertychange(1)

    input type=“text” 通过js改变输入框的value值是不会出发input propertychange事件

  2. jdbc驱动jar导入eclipse

    在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...

  3. Python编程-数据库

    1.MySQL 程序: socket客户端 根据IP和端口进行连接 发送指令: xxx 接收结果 socket服务端 运行起来 获取指令(recv) xxx 解析命令 文件夹操作: ... 文件操作: ...

  4. samba Doc

    Samba-HOWTO-Collection中文翻译版(2.20) 2013年08月23日 ⁄ 综合 ⁄ 共 19460字 ⁄ 字号 小 中 大 ⁄ 评论关闭 Samba计划文档 (初稿) Samba ...

  5. perl FAQ(zz)

    1. Why do you write a program in Perl? Ans : Easy to use and fast execution since perl script underg ...

  6. MySQL数据库基本操作(一)

    进入mysql 本地连接: mysql -u用户名 -p 输入密码 qwe123 mysql -uroot -pqwe123 sudo apt-get install mysql-server # p ...

  7. iOS应用网络安全之HTTPS

    移动互联网开发中iOS应用的网络安全问题往往被大部分开发者忽略,iOS9和OS X 10.11开始Apple也默认提高了安全配置和要求.本文以iOS平台App开发中对后台数据接口的安全通信进行解析和加 ...

  8. INSPIRED启示录 读书笔记 - 第40章 最佳实践经验

    十大要点 1.产品管理的职责:许多产品经理将大把的时间浪费在与产品管理无关的工作上 2.用户体验:对于大多数软件产品来说,用户体验就是产品的生命 3.机会评估:用方便快捷的机会评估方法取代过时的市场需 ...

  9. C++中容器的使用(二)

    第一章容器 第1条:慎重选择容器类型. 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器 ...

  10. gitblit搭建git服务器

    如果你的公司使用git作为版本管理工具,那么对gitblit应该也不会陌生.gitblit是一个开源的git服务器java实现,一般情况下gitblit都是由别人已经搭建好你直接使用就行了,除非你就是 ...