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. JavaScript快速入门-ECMAScript本地对象(Date)

    JavaScript中的Date 对象用于处理日期和时间. var myDate=new Date()  #Date 对象会自动把当前日期和时间保存为其初始值. 一.Date对象的方法 方法 示例 n ...

  2. stl源码剖析 详细学习笔记priority_queue slist

    // //  priority_queue.cpp //  笔记 // //  Created by fam on 15/3/16. // // //------------------------- ...

  3. 如何将maven项目打包上传到私服

    比如我们想要把项目通过maven生产源码包和文档包并发布到自己的私服上,有两个maven插件可以做到这些工作,一个是maven-source-plugin,另一个是maven-javadoc-plug ...

  4. js执行问题

    金三银四搞事季,前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下. 以下是我一个朋友的故事,真的不是我. f ...

  5. Fast Failure Detection and Recovery in SDN with Stateful Data Plane

    文章名称:Fast Failure Detection and Recovery in SDN with Stateful Data Plane 利用SDN的带状态数据平面进行快速故障检测和恢复 发表 ...

  6. Daily Scrum - 11/13

    时间:3:00pm - 3:30pm 今天小组例会主要是任烁分享他对WP源码的code review,通过分析与讨论我们了解了背单词模块的主要类(主要是词和单词本),取词方式(调用数据库接口),算法( ...

  7. Beta冲刺——day3

    Beta冲刺--day3 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...

  8. final版本发布评价II

    其实我对技术上的问题了解不多,所以有些评语可能说的不对或者压根就没啥用.可直接忽略.请见谅. 1新蜂的俄罗斯方块,UI设计虽然给出了背景和颜色,但是感觉色彩对比也不好,模块之间也不协调.没有更多的说服 ...

  9. 12th 本周工作量及进度统计

    本周PSP: C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 活动 1日—3日 用户调查 12月1日21:00 12月3日12:00 25小时 14小时 活动 ...

  10. 用javaScript将页面滚动条到底部

    ((JavascriptExecutor) driver).executeScript("document.body.scrollTop=500000"); 通过该方法可以将有滚动 ...