Description

Problem 5336. -- [TJOI2018]party

Solution

神奇的dp套dp...

考虑lcs的转移方程:
\[ lcs[i][j]=\begin{cases} lcs[i-1][j-1]+1 & (t[i]==s[j]) \\ \max (lcs[i-1][j],lcs[i][j-1]) \end{cases}\]

我们发现 \(lcs[i][j]-lcs[i][j-1] \le 1\),而且\(\left| S \right| \le 15\)
所以我们可以对lcs[i]差分之后状压到一个数\(a\).

先不考虑连续NOI的限制.
设dp[i][a]表示兑奖串长为i,且lcs[i]=a的方案数.
那么我们可以转移:
\[ \begin{cases} dp[0][0]=1 \\ dp[i][a]=\sum\limits_{c=1}^3 dp[i-1][trans[a][c]] \end{cases} \]
其中trans[a][c]表示a状态(lcs[i])加上字符c的状态(lcs[i+1]), 这个可以先解码出原lcs数组的值, 再像普通lcs一样维护, 再编码回去.

另外就是细节:

  • 串中没有连续的NOI: dp数组加一维即可
  • 卡空间, 滚动数组

详见代码.

Code

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;//---------------------------------------
const int nsz=1050,ksz=20,k2sz=4e4,nmod=1e9+7;
int n,k,bnd,line[ksz],ans[ksz];
char s[ksz];int ne[4]{0,1,2,3};
int dp[2][k2sz][3],cur=1;//0:x 1:1 2:12
int trans[k2sz][4],cnt1[k2sz];int val[2][ksz];
int sol1(int st,int c){//res=st+crep(i,1,k)val[0][i]=val[0][i-1]+((st>>(i-1))&1);rep(i,1,k){if(c==line[i])val[1][i]=val[0][i-1]+1;else val[1][i]=max(val[0][i],val[1][i-1]);}int res=0;rep(i,1,k)res|=((val[1][i]-val[1][i-1])<<(i-1));return res;
}
void add(int &a,int b){a=(a+b)%nmod;}
void sol(){//initbnd=(1<<k)-1;rep(i,0,bnd){if(i)cnt1[i]=cnt1[i&(i-1)]+1;rep(j,1,3)trans[i][j]=sol1(i,j);}dp[cur][0][0]=1;rep(i,1,n){cur^=1;memset(dp[cur],0,sizeof(dp[cur]));rep(j,0,bnd){rep(a,0,2){//dp[cur^1][j][a]if(a!=2)add(dp[cur][trans[j][ne[a+1]]][a+1],dp[cur^1][j][a]);if(a!=0)add(dp[cur][trans[j][1]][1],dp[cur^1][j][a]);rep(c,2,3){if(c==ne[a+1])continue;add(dp[cur][trans[j][c]][0],dp[cur^1][j][a]);}}}}rep(i,0,bnd){rep(j,0,2){add(ans[cnt1[i]],dp[cur][i][j]);}}
}int main(){ios::sync_with_stdio(0),cin.tie(0);cin>>n>>k>>(s+1);rep(i,1,k)line[i]=(s[i]=='N'?1:s[i]=='O'?2:3);sol();rep(i,0,k)cout<<ans[i]<<'\n';return 0;
}

转载于:https://www.cnblogs.com/ubospica/p/10290675.html

[模板] dp套dp bzoj5336: [TJOI2018]party相关推荐

  1. dp套dp(动态规划)

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

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

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

  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. 关于数据科学,书上不曾提及的三点经验
  2. spring集成jndi_Spring应用程序与JNDI连接池的集成测试
  3. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存
  4. 红包小游戏php源码,H5抢红包 小游戏源码
  5. 神策分析:三大价值搭建精细化渠道管理体系
  6. 【平头哥蓝牙Mesh网关开发套件试用体验】蓝牙mesh网关接入网络
  7. matlab触发 ttl,请问如何用TTL信号触发单反相机拍摄
  8. C语言数字图像处理---1.6图像亮度对比度调节
  9. 什么是PaaS平台 ?
  10. 血手耳机与笔记本驱动冲突
  11. 可维护性、可复用性和可扩展性的区别
  12. 黑苹果(i7-4790,华硕B85-plus主板)的过程
  13. 豆瓣自动顶帖机器人JS脚本
  14. idea替换区分大小写
  15. python实现按键精灵之按键操作key
  16. linux系统屏幕花屏,用Deepin 20社区版出现半截屏幕花屏的解决方案
  17. vue自写全屏/退出全屏组件
  18. QR二维码生成器源码(中间可插入小图片)
  19. HighTec编译器提高编译速度
  20. 毕业设计-基于机器视觉道路视频车道线检测识别

热门文章

  1. 指数型基金今年来收益排行榜
  2. 排列组合之插板法实例
  3. 电线的粗细与电流的大小怎么算?电流的大小与电器的功率有什么关系? 如何根据电流的大小选择铜质电线的粗细...
  4. Icon图标格式(用于生成*.ico图标)
  5. 拆t460拆机图解_雷神st pro怎么拆机?雷神st pro拆解详细评测图解
  6. Ubuntu16.04使用语义分割标注工具Semantic-Segmentation-Editor
  7. iGoogle创新设计大赛
  8. C#开发多语言翻译软件
  9. 关于信息安全专业学习的一些看法
  10. 计算机键盘图 指法,键盘指法练习图