题目链接:https://darkbzoj.cf/problem/3864

这个是DP套DP的典型例题。

常规LCS的求法:
设dp[i][j]表示到a[i],b[j]的LCS。
那么if \(a[i]!=b[j]\),then \(dp[i][j]=max(dp[i][j-1],dp[i-1][j])\)
if \(a[i]==b[j]\),then \(dp[i][j]=dp[i-1][j-1]+1\)

现在我们知道字符串a,但是不知道b。但是很显然的,对于b字符串,每增加一位(枚举),必然会有对相应LCS的贡献。
我们设f[i][s]表示当前处理到字符串b的第i位,且当前它与a的LCS的状态为s。g[s][0/1/2/3]表示在当前LCS状态为s的时候,在后面添加'A','T','C','G’之后的LCS情况。
那么可以列出递推式\(f[i][g[s][0/1/2/3]]+=f[i-1][s]\)
\(g\)数组的处理可以写到函数里,进行预处理。

然后就是要注意。。。。空间的问题,这题空间卡得太丧心病狂了。。。。。qwqwqwq

代码如下:

#include<cstring>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
using namespace std;
int n,m,t;
int g[(1<<15)+2][4],f[1001][(1<<15)+2],ans[111],pre[16],now[16],a[16];
char ss[16];
inline int calc(int x)
{int cur_ans=0;for(int i=20;i>=0;i--)if(x&(1<<i))cur_ans++;return cur_ans;
}
inline int trans(char x)
{if(x=='A') return 0;else if(x=='T') return 1;else if(x=='C') return 2;else return 3;
}
inline int solve(int s,int k)
{memset(pre,0,sizeof(pre));memset(now,0,sizeof(now));for(int i=0;i<n;i++) pre[i+1]=pre[i]+((s>>i)&1);for(int i=1;i<=n;i++){if(k==a[i]) now[i]=max(now[i],pre[i-1]+1);now[i]=max(max(now[i],now[i-1]),pre[i]);}int cur_ans=0;for(int i=0;i<n;i++) cur_ans+=(now[i+1]-now[i])*(1<<i);return cur_ans;
}
int main()
{scanf("%d",&t);while(t--){memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(ans,0,sizeof(ans));scanf("%s",ss+1);n=strlen(ss+1);for(int i=1;i<=n;i++) a[i]=trans(ss[i])+1;int maxx=1<<n;scanf("%d",&m);for(int i=0;i<=maxx;i++)for(int j=1;j<=4;j++)g[i][j]=solve(i,j);f[0][0]=1;for(int i=1;i<=m;i++)for(int j=0;j<=maxx;j++)for(int k=1;k<=4;k++)f[i][g[j][k]]=(f[i][g[j][k]]+f[i-1][j])%mod;for(int i=0;i<=maxx;i++)ans[calc(i)]=(ans[calc(i)]+f[m][i])%mod;for(int i=0;i<=n;i++)printf("%d\n",ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10204604.html

BZOJ3864 hero meet devil相关推荐

  1. bzoj千题计划241:bzoj3864: Hero meet devil

    http://www.lydsy.com/JudgeOnline/problem.php?id=3864 题意: 给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2... ...

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

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

  3. 「BZOJ3864」Hero meet devil 题解

    简要题意 给你一个只由 A G C T AGCT AGCT 组成的字符串 S S S ,对于每个 0 ≤ i ≤ ∣ S ∣ 0 \leq i \leq |S| 0≤i≤∣S∣,问有多少个只由 A G ...

  4. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

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

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

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

  7. hdu4899 Hero meet devil

    题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...

  8. [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 ...

  9. HDU 4899 Hero meet devil

    题意:一段DNA序列s,只包含字符ATGC,长度不超过15,求有多少种长度为n的DNA序列与s的最长公共子序列长度为0~len. 解法:状压dp. LSC: if(a[i] == b[j]) dp[i ...

最新文章

  1. 风暴航路的地图编号_砖厂风暴航路已倒闭,新的搬砖圣地诞生
  2. python 递归函数_连载|想用Python做自动化测试?递归函数
  3. 2.boost遍历数组容器
  4. 网络安全:与 TCP 连接管理相关的网络攻击
  5. 【OGG】 RAC环境下管理OGG的高可用 (五)
  6. 《Spark The Definitive Guide》Spark 权威指南学习计划
  7. LoadingCache源码剖析之缓存加载实现
  8. python一定要有主函数_Python 为什么没有 main 函数?为什么我不推荐写 main 函数?...
  9. 精业科技(天津)有限公司 Game Over
  10. 妙用Vista光盘轻松制作Windows PE 2.0启动光盘/闪存
  11. STM32固件库下载步骤
  12. Ubuntu16.04 php5安装失败解决方案
  13. FPS游戏:封装外部D3D透视模块
  14. Qt 5.15版本安装教程
  15. php创建留言板,PHP开发留言板教程之创建数据库
  16. 15kw科比服务器型号,KEB变频器/keb伺服技术/KEB制动器
  17. solaris9 x86安装oicq过程,sparc也行
  18. CoreXY运动结构工作原理
  19. 想借微商发家?打造千万级分销体系的方法论在这里!
  20. 电脑配置检测软件下载

热门文章

  1. 关于Chrome支持http header最大长度限制的讨论
  2. 如何使用SAP CRM Marketing Survey创建一个市场问卷调查
  3. ABAP和Java的destination和JNDI
  4. php两个数组找公共部分,PHP开发中如何查找两个数组的交集
  5. js 设置password placeholder样式_装机必备!超级详细的BIOS设置图解
  6. linux web 服务器性能,Linux系统Web服务器性能测试(2)
  7. 南柯服务器压力,性能测试的数据解释及分析 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  8. 886 微型计算机原理,886微型计算机原理及应用.pdf
  9. consul php,go-micro+php+consul实现简单的微服务
  10. linux服务器上装R语言,R语言 在linux上的安装