title

BZOJ 5336
LUOGU 4590
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。

analysis

发现其实和上道题 BZOJ 3864 一样,只是多了层限制,不能出现 \(NOI\) 字样,那么我们多开设一维记录前两位的状态就好啦。

具体的可以看看代码学习学习。

code

#include<bits/stdc++.h>
using namespace std;
const int maxk=16,mod=1e9+7;char buf[1<<15],*fs,*ft;
inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
template<typename T>inline void read(T &x)
{x=0;T f=1, ch=getchar();while (!isdigit(ch) && ch^'-') ch=getchar();if (ch=='-') f=-1, ch=getchar();while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();x*=f;
}template<typename T>inline void write(T x)
{if (!x) { putchar('0'); return ; }if (x<0) putchar('-'), x=-x;T num=0, ch[20];while (x) ch[++num]=x%10+48, x/=10;while (num) putchar(ch[num--]);
}typedef int iarr[maxk+1];
iarr a,f,g,ans;
int v[1<<maxk][3],w[3][3];
int F[2][1<<maxk][3];
char ch[maxk+1];
int main()
{int n,m;read(n);read(m);scanf("%s",ch+1);for (int i=1; i<=m; ++i){if (ch[i]=='N') a[i]=0;if (ch[i]=='O') a[i]=1;if (ch[i]=='I') a[i]=2;}for (int i=0; i<(1<<m); ++i){for (int j=0; j<m; ++j) f[j+1]=f[j]+(i>>j&1);for (int j=0; j<3; ++j){for (int k=1; k<=m; ++k)if (a[k]==j) g[k]=f[k-1]+1;else g[k]=max(f[k],g[k-1]);v[i][j]=0;for (int k=1; k<=m; ++k)if (g[k]>g[k-1]) v[i][j]|=1<<(k-1);}}w[0][0]=1,w[0][1]=0,w[0][2]=0;w[1][0]=1,w[1][1]=2,w[1][2]=0;w[2][0]=1,w[2][1]=0,w[2][2]=3;for (int j=0; j<(1<<m); ++j)for (int l=0; l<3; ++l) F[0][j][l]=0;int x=0;F[0][0][0]=1;for (int i=0; i<n; ++i,x^=1){for (int j=0; j<(1<<m); ++j)for (int l=0; l<3; ++l) F[x^1][j][l]=0;//memset(F[x^1],0,sizeof(F[x^1]));for (int j=0; j<(1<<m); ++j)for (int l=0; l<3; ++l) if (F[x][j][l])for (int k=0; k<3; ++k)if (w[l][k]<3) F[x^1][v[j][k]][w[l][k]]=(F[x^1][v[j][k]][w[l][k]]+F[x][j][l])%mod;}for (int i=0,v; i<(1<<m); ++i){v=__builtin_popcount(i);for (int l=0; l<3; ++l) ans[v]=((long long)ans[v]+F[x][i][l])%mod;}for (int i=0; i<=m; ++i) write(ans[i]),puts("");return 0;
}

转载于:https://www.cnblogs.com/G-hsm/p/11318560.html

BZOJ 5336: [TJOI2018]party Dp套Dp相关推荐

  1. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  2. BZOJ 3864: Hero meet devil (从dp性质实现dp套dp)

    题意:求长度为m的,字符集大小为4的,字符串,中,与字符串S(|S|<=15)的最长公共子序列长度=i的字符串数量.i∈0→∣S∣i \ \in 0 \to |S|i ∈0→∣S∣ 发现这个状态 ...

  3. dp套dp(动态规划)

    dp套dp 这是一个对于一类动态规划的计数问题的处理方法,问题常常是如果形式确定就可以直接dp,但是现在却要求满足某个要求的所有方案数,一般的处理方法就是一维负责增量构造,其他维度用来表示内部dp状态 ...

  4. [XSY] 相似(DP套DP)

    相似 在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解: https://blog.csdn.net/Ike940067893/a ...

  5. hdu4899 dp套dp

    题意:只含字母ATGC,  给定一个S串,长度小于等于15,构造满足LCS(S,T)=X的T串,求这样的T串的个数,0<=X<=|S| 网上有一堆题解,但大多数都讲得根本让人无法理解 以下 ...

  6. 【luogu P4590】游园会(DP套DP)

    游园会 题目链接:luogu P4590 题目大意 给你一个匹配字符串,然后问你对于所有的长度为 n 的字符串,满足不存在 NOI 的子串,跟匹配字符串 LCS 为 x 的有多少个,对于每个 x 都求 ...

  7. #3864. Hero meet devil dp套dp + 状压 + 状态机

    传送门 文章目录 题意: 思路: 题意: 给你一个只包含ACGTACGTACGT的串sss,再给你一个mmm,第iii行输出有多少个长度为mmm且只包含ACGTACGTACGT的串与sss的lcslc ...

  8. [ZJOI2019]麻将 题解(dp 套 dp)

    文章目录 前言 题面 题解 坑点 代码 前言 做这道题的想法从看到这场比赛的 T2 的题解时就开始了.3.1 ~ 3.16 号,共 16 天的历程,我才终于搞出来这道题.在这 16 天里,我每天都要花 ...

  9. P4590 [TJOI2018]游园会 dp套dp + 状态机

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串sss,其只包含NOINOINOI三个字母,给你一个mmm,代表ttt串的长度,ttt串包含NOINOINOI三个字母但是不存在三个连 ...

  10. [BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)

    题意 给你一个只由AGCT组成的字符串S(|S|≤15),对于每个1≤i≤|S| 询问有多少个只由AGCT组成的长度为m(1≤m≤1000)的字符串T,使得LCS(S,T)=i. |S|<=15 ...

最新文章

  1. CentOS7.2 安装Docker
  2. Android JNI入门第四篇——jni头文件分析
  3. linux系统知识 - 信号基础
  4. 如何用JavaScript判断dom是否有存在某class的值?
  5. 虚拟主机时代:美国主机如何在国内显神通
  6. html 缩略图点击预览,jQuery图片相册点击缩略图弹出大图预览特效
  7. access主窗体名词解释_ACCESS 父子窗体的语法介绍
  8. 小屏手机大势已去!iPhone 12 Pro Max被买空mini居然还有货
  9. vsftp.conf 配置文件详解
  10. 微控制器实验计算机组成原理,计算机组成原理(西安理工大学)实验二cpth模型机综合实验——微控制器实验.doc...
  11. Android热修复Sophix详解
  12. 即时通讯 视频会议开源技术选择
  13. excel拆分工具怎么拆分表格?
  14. 雷柏M300G使用体验
  15. 华为领衔,“5G+摄像头”拿下双影帝,多家国产手机凭借拍照入围MWC最佳演员... 1
  16. 如何解决‘CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’错误
  17. C++并查集算法(详细)
  18. ICDE-2020 论文简析:空间众包中的预测任务分配 : 一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing
  19. 30岁人生进度条_你的人生进度条,只剩下最后的1%
  20. PMP 考试一定要报培训班吗?求靠谱培训机构,最好是自己考过的!

热门文章

  1. aws linux使用ssh登陆_aws 创建新用户并使用 ssh 登录
  2. 微信小程序企业号注册
  3. 华为机试题 好友关系管理
  4. 三、 CSS3流星雨划过动画特效
  5. 图床PICGo工具报错问题
  6. (几何学:大圆距离)编写一个程序,提示用户输入地球表面两点经度和纬度的度数然后显示它们的大圆距离。
  7. 【HTML 教程系列第 10 篇】什么是 HTML 中的水平线标签 hr
  8. 河南城建学院计算机学院排名,河南城建学院2019年度“读书之星”评选结果公示...
  9. 2023扬州大学计算机考研信息汇总
  10. 创建与维护MySQL数据库