https://www.lydsy.com/JudgeOnline/problem.php?id=5336

萌新第一次写dp套dp.

先不考虑有NOI的限制.

考虑普通lcs是怎么做的.

f[i][j]=max(f[i-1][j],f[i][j-1],(f[i-1][j-1]+1)*[S[i]==T[j]]).

设f[i]表示对于原串,生出串做到第i的位置时,最长公共子序列长度.

发现相邻的i-1~i只会f值最多+1,于是可以对这个状态进行差分后,状压存储.

预处理出在状态S后添加字符w[i],所得到的新的f[].

设dp[i][S][len]表示dp到第i位,f的差分后状态位S,匹配NOI字符串的长度为len.

添加字符w有

dp[i][trans[S][w]][mp[len][w]]+=dp[i-1][S][len].

#include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i,s,t) for(register int i=s;i<=t;++i)
#define _rep(i,s,t) for(register int i=s;i>=t;--i)
#define Rep(i,s,t) for(register int i=s;i<t;++i)
#define go(x) for(register int e=las[x];e;e=nxt[e])
#define re register
#define fi first
#define se second
#define mp(x,y) make_pair(x,y)
#define pb push_back
#define pii pair<int,int>
#define gi(x) read(x)
#define gii(x,y) read(x),read(y)
#define giii(x,y,z) read(x),read(y),read(z)
#define ms(f,x) memset(f,x,sizeof f)
namespace IO{#define gc getchar()#define pc(x) putchar(x)template<typename T>inline void read(T &x){x=0;int f=1;char ch=gc;while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=gc;}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=gc;x*=f;return;}template<typename T>inline void write(T x=0){T wr[51];wr[0]=0;if(x<0)pc('-'),x=-x;if(!x)pc(48);while(x)wr[++wr[0]]=x%10,x/=10;while(wr[0])pc(48+wr[wr[0]--]);return;}
}
using IO::read;
using IO::write;
typedef long long ll;
typedef double db;
using namespace std;
const int mod=1e9+7;
char w[]={'N','O','I'};
char ch[20];
int n,m,S;
int f[2][1<<15][3],mp[3][3],ans[1011];
int g[20],h[20],trans[1<<15][3],sz[1<<15];
inline void inc(int &x,int y){x+=y;if(x>=mod)x-=mod;
}
inline int zip(int *h){re int s=0;rep(i,1,n)s|=((h[i]-h[i-1])<<(i-1));return s;
}
inline void unzip(int *h,int s){rep(i,1,n)h[i]=h[i-1]+(s&1),s>>=1;
}
inline void init(){rep(i,1,S)sz[i]=sz[i>>1]+(i&1);rep(k,0,2)rep(s,0,S){unzip(g,s),ms(h,0);rep(i,1,n){h[i]=max(h[i-1],g[i]);if(w[k]==ch[i])h[i]=max(h[i],g[i-1]+1);}trans[s][k]=zip(h);}
}
int main(){gii(m,n),scanf("%s",ch+1),S=(1<<n)-1,init();mp[0][0]=mp[1][0]=mp[2][0]=f[0][0][0]=1,mp[1][1]=2;rep(i,1,m){int p=i&1,q=p^1;ms(f[p],0);rep(s,0,S)rep(j,0,2)rep(k,0,2){if(k==2&&j==2)continue;re int y=trans[s][k];inc(f[p][y][mp[j][k]],f[q][s][j]);  }}rep(s,0,S)rep(j,0,2)inc(ans[sz[s]],f[m&1][s][j]);rep(i,0,n)printf("%d\n",ans[i]);return 0;
}

BZOJ5336

转载于:https://www.cnblogs.com/Stump/p/9069293.html

BZOJ5336 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. dp套dp(动态规划)

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

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

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

  4. 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∣ 发现这个状态 ...

  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. 整合资源_java的基础关键字
  2. NAT+VLAN+CHAP实验配置(一)
  3. 学习笔记Flink(四)—— Flink基础API及核心数据结构
  4. bzoj4514[Sdoi2016]数字配对
  5. phantomjs安装所需依赖
  6. PDF.js开发笔记
  7. Uber提出有创造力的POET:自行开发更困难环境和解决方案
  8. talentcentral测评结果_WinTalent人才测评系统
  9. invocation, 作者 Medwyn Goodall,女巫医 [搜索 invocation Medwyn Goodall]
  10. 油猴管理程序复制百度文库网页内容
  11. 【计算机网络】谢希仁教材轻松解读 概述篇
  12. Spring学习笔记 Spring项目介绍
  13. WIFI6比WIFI5好在哪里呢?
  14. Android打印小票速度太慢,解决打印PDF打印机打印速度慢的问题(适用所有打印机)...
  15. linux web 网站搭建
  16. 2022年南京Java培训机构排名,实力突出遥遥领先
  17. 沧海一粟第五次团队博客
  18. spinal HDL - 02 - Spinal HDL数据类型 - 基本数据类型
  19. 国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题4(含答案)
  20. 华硕笔记本重置计算机,手把手教你华硕笔记本电脑如何恢复出厂设置

热门文章

  1. 4Packet Tracer – 配置 VLAN
  2. 恢复计算机注册表命令,恢复电脑注册表的方法
  3. 红黑树模拟软件_红黑树,超强动静图详解,简单易懂
  4. java并发编程 第二期 CAS
  5. c语言幼儿园积木游戏,干货来袭!超详细幼儿园游戏活动教案
  6. VTK笔记-图形相关-两个平面上的多边形+三角带=闭合多边形(棱柱体)
  7. ios兼容iphonex刘海屏解决方案
  8. 富文本编辑器抓取秀米图片转存到七牛云
  9. C语言工程网络图,三分钟教你学会 双代号网络图的绘制
  10. 读微博营销案例-杜蕾斯套鞋事件