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。

解题思路:

该题是状态压缩dp,也有称为基于dp的dp。
首先不考虑条件不出现NOI,我们发现的是我们需要统计的LCS值,可以通
过dp处理出来的。那么考虑,如果考虑到兑奖串第i位的时候,如果知道之
前lcs这个dp的状态,就可以求出这位取不同值的时候lcsdp的状态。考虑在
做lcs的时候,可以知道的是相邻的两个dp值的差不超过1,我们就吧这层
中lcsdp的状态用他们的差来记录,这样就使得状态有2^k 次种,k为奖章串的
长度,然后考虑这2^k 状态的转移,每种有四种情况。
最后复杂度为O(2^k × N)
现在在考虑NOI不能出现,只需要在原来的基础上加上一维即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1005,mod=1e9+7;
inline void add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
int n,m,S,tr[1<<15][3],f[2][1<<15][3],bin[1<<15],trl[3][3],g[20],h[20],ans[20];
char ch[20],c[3];
void decode(int s)
{g[0]=0;for(int i=1;i<=m;i++)g[i]=g[i-1]+(s>>i-1&1);
}
int incode()
{int res=0;for(int i=1;i<=m;i++)res|=(h[i]-h[i-1])<<i-1;return res;
}
void pre()
{S=1<<m;c[0]='N',c[1]='O',c[2]='I';trl[0][0]=1,trl[0][1]=0,trl[0][2]=0;trl[1][0]=1,trl[1][1]=2,trl[1][2]=0;trl[2][0]=1,trl[2][1]=0,trl[2][2]=3;for(int s=1;s<S;s++)bin[s]=bin[s>>1]+(s&1);for(int j=0;j<3;j++)for(int s=0;s<S;s++){decode(s);memset(h,0,sizeof(h));for(int i=1;i<=m;i++)h[i]=c[j]==ch[i]?g[i-1]+1:max(h[i-1],g[i]);tr[s][j]=incode();}
}
int main()
{//freopen("party.in","r",stdin);//freopen("party.out","w",stdout);scanf("%d%d%s",&n,&m,ch+1);pre();f[0][0][0]=1;for(int i=0,now=0;i<n;i++,now^=1)for(int s=0;s<S;s++)for(int k=0;k<3;k++)if(f[now][s][k]){for(int j=0;j<3;j++)if(trl[k][j]<3)add(f[now^1][tr[s][j]][trl[k][j]],f[now][s][k]);f[now][s][k]=0;}for(int s=0;s<S;s++)for(int j=0;j<3;j++)add(ans[bin[s]],f[n&1][s][j]);for(int i=0;i<=m;i++)cout<<ans[i]<<'\n';return 0;
}


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. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
  2. 微服务架构面试送送送命题!
  3. java 类 大全_JAVA集合类汇总
  4. 从0搭建一个Springboot+vue前后端分离项目(三)使用idea进行页面搭建+Element框架
  5. delphi调用windows api
  6. 大数据实效_全流程监督 让大数据督查取得实效
  7. 多维度创新打造领先阿里云技术生态
  8. JVM 内存区域方面的面试题
  9. stm32f103c8t6开发版点亮oled屏幕工程文件_OLED液晶屏如何显示中文呢
  10. Map与Json的相互转化
  11. 7. 敏捷软件开发框架 - 极限编程XP
  12. Exchange 2010输入序列号方式
  13. Visual Studio 2017 激活密钥 [复制记录]
  14. 【华为云技术分享】快速搭建网站之云速建站
  15. android之ExoPlayer探索
  16. VTK:生成网格(附完整源码)
  17. 重装Ubuntu(Linux)后快速搭建工作环境(深度学习环境)
  18. 数据分析之数理统计基础
  19. UVA11134 Fabled Rooks
  20. python找不到解释器_解决pycharm找不到解释器的问题

热门文章

  1. java论坛 基于SSM框架的游戏论坛 java游戏贴吧 java游戏论坛 java论坛 ssm论坛 ssm贴吧 可以改为各种论坛,分类可在后台自己控制,图片可任意换
  2. 详细的Faster R-CNN源码解析之proposal_layer和proposal_target_layer源码解析
  3. 【Windows】WPS | 多级编号 | 自定义多级标号
  4. [小说]魔王冢(23)道士
  5. 沙场已无李世鹤:论TD-LTE专利
  6. 分节符的插入与删除word
  7. Criss-Cross Attention for Semantic Segmentation论文及代码分析
  8. Mysql数据表和表数据复制
  9. 如果宇宙是答案,那么问题是什么?
  10. Drupal 主题函数知识