1973: [JLOI2011]基因补全

Time Limit: 1 Sec  Memory Limit: 256 MB

Description

在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对。两个碱基序列能相互匹配,当且仅当它们等长,并且任意相同位置的碱基都是能相互配对的。例如ACGTC能且仅能与TGCAG配对。一个相对短的碱基序列能通过往该序列中任意位置补足碱基来与一个相对长的碱基序列配对。补全碱基的位置、数量不同,都将视为不同的补全方案。现在有两串碱基序列S和T,分别有n和m个碱基(n>=m),问一共有多少种补全方案。

Input

数据包括三行。
第一行有两个整数n,m,表示碱基序列的长度。
第二行包含n个字符,表示碱基序列S。
第三行包含m个字符,表示碱基序列T。
两个碱基序列的字符种类只有A,C,G,T这4个大写字母。

Output

答案只包含一行,表示补全方案的个数。

Sample Input

10 3 CTAGTAGAAG TCC

Sample Output

4

HINT样例解释:

TCC的4种补全方案(括号中字符为补全的碱基)
(GA)TC(AT)C(TTC)
(GA)TC(ATCTT)C
(GA)T(CAT)C(TT)C
(GATCA)TC(TT)C

数据范围:
30%数据  n<=1000,m<=2
50%数据  n<=1000,m<=4
100%数据 n<=2000,m<=n

这道题需要用到高精度,在高精度的同时做LCS,记得要用滚动数组,否则有可能MLE

 #include<stdio.h>
char a[],b[];
int n_a[],n_b[];
int f[][];
int how_many[][][];
int n,m;
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
void add(int a,int b,int c,int d)
{
int tmp=max(how_many[c][d][],how_many[a][b][]);
int middle=;
int middle2;
for(int i=;i<=tmp;i++)
{
middle2=(how_many[c][d][i]+how_many[a][b][i]+middle)/;
how_many[a][b][i]=(how_many[c][d][i]+how_many[a][b][i]+middle)%;
middle=middle2;
}
how_many[a][b][]=tmp;
while(middle)
{
how_many[a][b][++how_many[a][b][]]=middle%;
middle/=;
}
}/*高精度求和*/
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",a);
scanf("%s",b);
for(int i=;i<n;i++)
{
if(a[i]=='A')
{
n_a[i+]=;
}
else if(a[i]=='T')
{
n_a[i+]=;
}
else if(a[i]=='G')
{
n_a[i+]=;
}
else if(a[i]=='C')
{
n_a[i+]=;
}
how_many[i%][][]=;
how_many[i%][][]=;
}/*将a字符的字母转换成可以匹配的形式,方便进行LCS*/
for(int i=;i<m;i++)
{
if(b[i]=='A')
{
n_b[i+]=;
}
else if(b[i]=='T')
{
n_b[i+]=;
}
else if(b[i]=='G')
{
n_b[i+]=;
}
else if(b[i]=='C')
{
n_b[i+]=;
}
how_many[][i][]=;
how_many[][i][]=;
}
how_many[][][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int k=how_many[i%][j][];k>=;k--)
how_many[i%][j][k]=;
if(n_a[i]==n_b[j])
{
if(f[i-][j-]+>=f[i-][j]&&f[i-][j-]+>=f[i][j-])
{
f[i][j]=f[i-][j-]+;
}
else if(f[i-][j-]+<=f[i-][j]&&f[i-][j]>=f[i][j-])
{
f[i][j]=f[i-][j];
}
else if(f[i][j-]>=f[i-][j]&&f[i-][j-]+<=f[i][j-])
{
f[i][j]=f[i][j-];
}
if(f[i][j]==f[i-][j-]+)
{
add(i%,j,(i-)%,j-);
}
if(f[i][j]==f[i-][j])
{
add(i%,j,(i-)%,j);
}
if(f[i][j]==f[i][j-])
{
add(i%,j,i%,j-);
}
}
else
{
if(f[i-][j]>=f[i][j-])
{
f[i][j]=f[i-][j];
}
else if(f[i][j-]>=f[i-][j])
{
f[i][j]=f[i][j-];
}
if(f[i][j]==f[i-][j])
{
add(i%,j,(i-)%,j);
}
if(f[i][j]==f[i][j-])
{
add(i%,j,i%,j-);
}
}
}
}/*LCS加上求方案数*/
for(int i=how_many[n%][m][];i;i--)
{
if(i!=how_many[n%][m][])
printf("%09d",how_many[n%][m][i]);
else
printf("%d",how_many[n%][m][i]);
}/*高精度输出*/
}

[JLOI2011]基因补全的更多相关文章

  1. 2764: [JLOI2011]基因补全

    2764: [JLOI2011]基因补全 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 570  Solved: 187[Submit][Status ...

  2. BZOJ_2764_[JLOI2011]基因补全_DP_高精度

    BZOJ_2764_[JLOI2011]基因补全_DP_高精度 Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对 ...

  3. 【bzoj2764】[JLOI2011]基因补全 dp+高精度

    题目描述 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互匹配,当且仅当它们等长,并且任意相同位置的碱 ...

  4. BZOJ2764 [JLOI2011]基因补全

    Description 在 生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互 匹配,当且仅当它们等长,并 ...

  5. bzoj2764 基因补全

    Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互匹配,当且仅当它们等长,并且任 ...

  6. Oracle补全日志(Supplemental logging)

    Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...

  7. python 添加tab补全

    在平时查看Python方法用到tab补全还是很方便的. 1. mac 平台 配置如下: mac是类Unix平台,需要在添加一条配置内容到bash_profile 中(默认是没有这个文件,可以新建一个放 ...

  8. 记录一次bug解决过程:else未补全导致数据泄露和代码优化

    一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 空指针是最容易犯的错误,数据的空指针,可以普遍采用三目运算符来解决 SVN冲突解决关 ...

  9. jQuery 邮箱下拉列表自动补全

    综述 我想大家一定见到过,在某个网站填写邮箱的时候,还没有填写完,就会出现一系列下拉列表,帮你自动补全邮箱的功能.现在我们就用jQuery来实现一下. 博主原创代码,如有代码写的不完善的地方还望大家多 ...

随机推荐

  1. MySQL 5.7 InnoDB缓冲池NUMA功能支持——但是别高兴的太早

    当前CPU都已是NUMA架构,相信除了历史遗留系统,很少会有数据库跑在SMP的CPU上了.NUMA架构带来的优势无言而语,CPU更快的内存访问速度,但是带来的问题也不言而喻,特别是对于数据库的影响.M ...

  2. html的布局demo

    header section footer 都是水平,垂直居中,文本内容居中 section的高度是根据文本内容自适应的,footer会一直在最下面 <!DOCTYPE html> < ...

  3. linux(二)之linux常用命令一

    linux的命令非常之多,命令多就算了关键每个命令还有很多的参数.不过其实并不要去害怕它.你只要常去用,并且的话,大部分你只要记住命令,参数不记得我们可以去查帮助文档.加油吧!老帖们. 一.登入\登出 ...

  4. ECJTUACM16 Winter vacation training #1 题解&源码

    //寒假训练赛,第一次拿第一,感觉很爽哦,AC3题! A------------------------------------------------------------------------ ...

  5. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)

    A. Diversity time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...

  7. 整数n的全排列

    第一道用搜索码的.得纪念一下 #include <iostream> #include <cstdio> #include <cstring> #include & ...

  8. 【JAVA】SWING_ 界面风格

    在java中,界面外观的管理是由UIManager类来管理的.不同的系统上安装的外观不一样 ,默认的是java的跨平台外观. 1.获取系统所有外观 import javax.swing.*; impo ...

  9. angular1项目打包app及logo和启动图片的设置

    打包思想:ionic和angular混合开发app,那么纯angular1的项目也是可以打包出来. 技术需要:安装一个新的ionic2的项目,环境配置成功,这里打包的配置需要 http://www.c ...

  10. pylint python2.7 安装记录

    环境:python 2.7.11 ; 源码安装:configparser 3.5.0; 如果出现以下error,请用源码更新configparser至3.5.0版本 具体error没有抓下来,主要是报 ...