http://www.lydsy.com/JudgeOnline/problem.php?id=3864

题意:

给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2....

求LCS方式:f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]*(s[i]==t[j]))

固定了i,相邻的j的f[i][j]值最多相差1

dp[i][j] 表示长度为i的DNA序列,将“f[ |S| ][j+1]是否比f[ |S| ][j] 大1” 这个状态压缩为j的方案数

若我们知道 状态j加上一个字母k可以到状态nxt[j][k]

那么dp[i+1][nxt[j][k]]+=dp[i][j]

关键是如何求得nxt[j][k]

再一次DP

枚举所有的状态i

令f[j] 表示加上字母k之前的LCS长度,g[j]表示加上字母k之后的LCS长度

g[j]=max(g[j-1],f[j])

如果加上的字母k和原序列第j个字母匹配 g[i]=max(g[j],f[j-1]+1)

g求完后,项邻的两个g要么相等,要么相差1

再把这个状态压缩起来即可

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int mod=1e9+; int m; char ss[];
int L,S;
int s[]; int ch[]; int f[],g[];
int nxt[<<][]; int dp[][<<];
int ans[]; void pre()
{
int len; int c[];
for(int i=;i<S;++i)
{
memset(f,,sizeof(f));
for(int j=;j<=L;++j) f[j]=f[j-]+(i>>j-&);
for(int k=;k<;++k)
{
for(int j=;j<=L;++j)
{
g[j]=max(g[j-],f[j]);
if(s[j]==k) g[j]=max(g[j],f[j-]+);
}
nxt[i][k]=;
for(int j=;j<L;++j)
if(g[j+]-g[j]) nxt[i][k]+=<<j;
}
}
} int count(int x)
{
int sum=;
while(x)
{
sum+=x&;
x>>=;
}
return sum;
} void DP()
{
memset(dp,,sizeof(dp));
int now=,last=;
dp[][]=;
for(int i=;i<=m;++i)
{
memset(dp[now],,sizeof(dp[now]));
for(int j=;j<S;++j)
for(int k=;k<;++k)
{
dp[now][nxt[j][k]]+=dp[last][j];
dp[now][nxt[j][k]]-=dp[now][nxt[j][k]]>=mod ? mod : ;
}
swap(now,last);
}
memset(ans,,sizeof(ans));
int t;
for(int i=;i<S;++i)
{
t=count(i);
ans[t]+=dp[last][i];
ans[t]-=ans[t]>=mod ? mod : ;
}
for(int i=;i<=L;++i) printf("%d\n",ans[i]);
} int main()
{
ch['A'-'A']=;
ch['C'-'A']=;
ch['G'-'A']=;
ch['T'-'A']=;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",ss+);
scanf("%d",&m);
L=strlen(ss+);
S=<<L;
for(int i=;i<=L;++i) s[i]=ch[ss[i]-'A'];
pre();
DP();
}
return ;
}

bzoj千题计划241:bzoj3864: Hero meet devil的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. 使用C#创建WCF服务控制台应用程序

    本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 开发环境:VS2015 编程语言:C# IIS版本:10.0.0.0 二.添加WCF服务.Internet Info ...

  2. 3. Python3 基本数据类型

    Python3 基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型& ...

  3. hexo搭建

    http://blog.csdn.net/gdutxiaoxu/article/details/53576018

  4. spring boot 添加整合ssl使得http变成https方法

    1. https出现的背景:(1)都知道http传输协议是裸漏的,明文传输的,极易被黑客拦截,因此,(2)人们想出的使用加密,也就是 对称加密 例如aes,不过这个由于因为对称加密需要每个客户端和服务 ...

  5. 第二个spring冲刺第4天

    今天,我们团队参考了其他团队的四则运算的程序,发现很多地方可以学习. 1.别人的界面比较唯美,我们做的有点粗糙,所以这个必须要改善. 2.别人的具有较多的功能,比如计时器,我们要效仿. 3.还有难度选 ...

  6. 校园社交网站app

    1.项目说明 1.1 项目背景 虽然公共社交网络系统能够满足大多数高校校园用户在校园网络社交的需求,但是针对校园学习.工作和文化生活等方面的支持以及学校个性化需求方面却存在不足.利用电子校务平台的数据 ...

  7. Beta版本冲刺(六)

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  8. WebView 5.0+闪烁以及白屏问题完美解决

    Android webView 在5.0+上启动硬件加速,造成部分手机出现闪烁.白屏等现象 必须写下这篇博客,遇到的问题搞了很久,百度谷歌就是没有完整的答案,记录下来,方便博友们: 需求:一个简单的W ...

  9. Git从零开始(一)

    一.首先windows安装git客户端 官网下载地址:https://git-for-windows.github.io/,这里下载会很慢,我试了好几次都失败了. 百度网盘资源: https://pa ...

  10. Hbase远程连接:Can't get the locations

    当Java API远程连接出错:Can't get the locations 原先填入的是IP地址,后来改为HOSTS文件中配置的主机名问题解决,如下红色字体部分: conf.set("h ...