BZOJ5336 TJOI2018 party


Description

小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是N, O, I的字样。在会场上他收集到了K个奖章组成的串。
兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。
现在已知兑奖串长度为N,并且在兑奖串上不会出现连续三个奖章为NOI,即奖章中不会出现子串NOI。
现在小豆想知道各个奖励等级会对应多少个不同的合法兑奖串。

Input

第一行两个数,N,K分别代表兑奖串的长度,小豆收集的奖章串的长度。
第二行一共K个字符,表示小豆得到奖章串。
N<=1000 & K<=15

Output

一共K+1行,第i行表示小豆最后奖励等级为i-1的不同的合法兑奖串的个数,可能这个数会很大,结果对10^9 + 7取模。

Sample Input

3 2
NO

Sample Output

1
19
6
提示
最长公共子序列长度0的串有:III;
最长公共子序列长度2的串有:NON, NNO, NOO, ONO,INO, NIO;
除去NOI,余下的19(26-6-1)种为最长公共子序列长度为1。


我们发先在对lsm进行计算的时候相邻两个DP值的差最多是一,所以我们借此进行状态构造。把一个dp值差分后的01串作为状态,然后对这个状态进行DP,因为我们需要考虑的特殊情况只有NOI,所以添加一维记一下状态就好了


#include<bits/stdc++.h>
using namespace std;
#define K 20
#define N 1010
#define S (1<<16)
#define Mod 1000000007
int n,k,bit[K],ans[K]={0};
int now[K]={0},res[K]={0},a[K];
int T[S][3]={0};
int dp[2][3][S]={0},ind=0,frm=1;
/*
dp数组中第二维
0->没有特殊限制
1->末尾是N
2->末尾是NO
*/
/*
N->0
O->1
I->2
*/
void add(int &x,int y){x=(x+y)%Mod;}
int countsiz(int s){int cnt=0;while(s)cnt++,s-=s&-s;return cnt;}
int main(){scanf("%d%d",&n,&k);getchar();for(int i=1;i<=k;i++){char c;scanf("%c",&c);if(c=='N')a[i]=0;if(c=='O')a[i]=1;if(c=='I')a[i]=2;}bit[1]=1;for(int i=2;i<=k;i++)bit[i]=bit[i-1]<<1;int up=(1<<k)-1;for(int s=0;s<=up;s++){for(int i=1;i<=k;i++)now[i]=now[i-1]+(bool)(s&bit[i]);for(int typ=0;typ<3;typ++){for(int i=1;i<=k;i++)if(a[i]==typ)res[i]=now[i-1]+1;else res[i]=max(res[i-1],now[i]);for(int i=1;i<=k;i++)T[s][typ]|=bit[i]*(res[i]-res[i-1]);}}dp[ind][0][0]=1;for(int i=1;i<=n;i++){ind^=1;frm^=1;memset(dp[ind],0,sizeof(dp[ind]));for(int s=0;s<=up;s++){//没有限制->没有限制(当前出现O或I)add(dp[ind][0][T[s][1]],dp[frm][0][s]);add(dp[ind][0][T[s][2]],dp[frm][0][s]);//没有限制->限制1(当前出现N)add(dp[ind][1][T[s][0]],dp[frm][0][s]);//限制1->没有限制(当前出现I)add(dp[ind][0][T[s][2]],dp[frm][1][s]);//限制1->限制1(当前出现N)add(dp[ind][1][T[s][0]],dp[frm][1][s]);//限制1->限制2(当前出现O)add(dp[ind][2][T[s][1]],dp[frm][1][s]);//限制2->没有限制(当前出现O)add(dp[ind][0][T[s][1]],dp[frm][2][s]);//限制2->限制1(当前出现N)add(dp[ind][1][T[s][0]],dp[frm][2][s]);}}for(int s=0;s<=up;s++)for(int i=0;i<3;i++)add(ans[countsiz(s)],dp[ind][i][s]);for(int i=0;i<=k;i++)printf("%d\n",ans[i]);return 0;
}


转载于:https://www.cnblogs.com/dream-maker-yk/p/9676318.html

BZOJ5336 TJOI2018 party 【状压DP】*相关推荐

  1. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  2. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  3. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  4. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  5. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  6. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  7. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  8. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

  9. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  10. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

最新文章

  1. 简易排水简车的制作 TurnipBit 系列教程
  2. 线性链表java实现_java实现线性单链表
  3. 团队-爬虫豆瓣top250项目-模块开发过程
  4. 5G 时代,将边缘计算进行到底!
  5. OSPF报文分类与格式
  6. 如何搜索你想要的R包?
  7. hwclock(Linux)
  8. Oracle数据库基本操作(windows 本地环境)
  9. 关于使用VS2015编译项目时出现LNK1112 module machine type 'x64' conflicts with target machine type 'X86'
  10. 月租最便宜的手机卡_给大家推荐几张0月租,打电话还便宜的手机卡
  11. 谷歌浏览器:快速切换搜索引擎
  12. 尽量使用unity引擎的Random随机数
  13. 百度智能云AI接口的植物识别
  14. 程序猿真的觉得写代码比女朋友重要吗?
  15. 论文泛读笔记《Neural Document Summarization by Jointly Learning to Score and Select Sentences》
  16. Adobe After Effect (AE) cc2020 安装教程【64位】
  17. 记录微星gl63的ubuntu 18.04重装rtl8821ce驱动,重获wifi
  18. 计算机sci期刊必需要提交原始数据,sci投稿的时候需要附上原始数据和处理过程么...
  19. 轻巧的jQuery提示框插件Tipso
  20. 卸载Windows服务命令sc delete失效

热门文章

  1. 总结 10 年前端经验,谈谈前端人如何更快地成长
  2. 前端学习入门,如何系统的学习前端?
  3. 服务器自动post,Go Web服务器自动重定向POST请求
  4. linux 查看最近用户,Linux下查看用户列表
  5. vb 循环放音乐_为何洒水车一直无限循环播放《兰花草》这首歌呢?
  6. 后端数据成功返回 页面不渲染_在浏览器地址栏输入地址到页面渲染完成发生了什么?(下)...
  7. rpc wmi 服务不可用_在Windows上修复“RPC服务器不可用”的方法
  8. css中的滤镜,CSS中的filter(滤镜)属性
  9. Scrapy框架的用法实例
  10. 尚硅谷面试第一季-21消息队列在项目中的应用