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. oracle之 SYSAUX表空间维护

    1.查询表空间使用率SQL> set linesize 400SQL> set pagesize 400SQL> SELECT D.TABLESPACE_NAME 表空间名称,SPA ...

  2. 分布式架构ActiveMQ的安装与使用(单节点)

    具体内容请参考样例代码和视频教程: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53   IP:192.168.4. ...

  3. group()与groups()的区别

    group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组. groups() 返回一个包含所有小组字符串的元组,从 1 ...

  4. Javac编译时出现包不存在的报错的解决方案

    今天在学习包类调用时出现如下错误: packa包不存在,在C盘目录下应该有这个包啊 原因是在当前目录下没找到,因为packa存放在其它目录下 如何解决: 应该配置一个classpath,直接把包所在的 ...

  5. 【Java学习笔记之四】java进制转化

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  6. AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】

    A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...

  7. Gym101522A Gym101522C Gym101522D

    Gym101522A A There are two popular formats for representing a date: day/month/year or month/day/year ...

  8. cesium编程入门(三)开始使用cesium开发

    搭建最简的开发环境 这一节来搭建一个最简单的能运行的helloworld,以后的代码也会在这一节的基础上慢慢增加 创建文件夹 mkdir cesium-test cd cesium-test 引入编译 ...

  9. js判断是否为ie浏览器

    之前在开发时遇到浏览器的兼容性问题,涉及到对ie浏览器的判断.现在此做个笔记. 这里我以函数的形式来判断,在用的时候直接调用即可. var isIE = !!window.ActiveXObject ...

  10. 我是如何将网站全站启用Https的?-记录博客安装配置SSL证书全过程

    评论»   文章目录 为什么要Https 如何选择Https 安装部署SSL证书 平滑过渡Https 搜索引擎的响应 启用Https小结 正如大家所看到的,部落全站已经启用了Https访问了,连续几天 ...