[JLOI2011]基因补全
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
Output
答案只包含一行,表示补全方案的个数。
Sample Input
Sample Output
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]基因补全的更多相关文章
- 2764: [JLOI2011]基因补全
2764: [JLOI2011]基因补全 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 570 Solved: 187[Submit][Status ...
- BZOJ_2764_[JLOI2011]基因补全_DP_高精度
BZOJ_2764_[JLOI2011]基因补全_DP_高精度 Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对 ...
- 【bzoj2764】[JLOI2011]基因补全 dp+高精度
题目描述 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互匹配,当且仅当它们等长,并且任意相同位置的碱 ...
- BZOJ2764 [JLOI2011]基因补全
Description 在 生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互 匹配,当且仅当它们等长,并 ...
- bzoj2764 基因补全
Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互匹配,当且仅当它们等长,并且任 ...
- Oracle补全日志(Supplemental logging)
Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...
- python 添加tab补全
在平时查看Python方法用到tab补全还是很方便的. 1. mac 平台 配置如下: mac是类Unix平台,需要在添加一条配置内容到bash_profile 中(默认是没有这个文件,可以新建一个放 ...
- 记录一次bug解决过程:else未补全导致数据泄露和代码优化
一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 空指针是最容易犯的错误,数据的空指针,可以普遍采用三目运算符来解决 SVN冲突解决关 ...
- jQuery 邮箱下拉列表自动补全
综述 我想大家一定见到过,在某个网站填写邮箱的时候,还没有填写完,就会出现一系列下拉列表,帮你自动补全邮箱的功能.现在我们就用jQuery来实现一下. 博主原创代码,如有代码写的不完善的地方还望大家多 ...
随机推荐
- 【转载】ipcs与Linux共享内存
一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要 ...
- js变量提升小记
作为世界上最优美的语言javascript的使用者,呵呵,js的魅力是无穷的,今天来聊聊他的魅(dan)力(teng)之一,变量提升. 每种语言所定义的变量基本都会有一定得作用域,而js的作用域则存在 ...
- 2.2 .this的绑定规则
2.this的绑定规则 1.默认绑定 function foo( ) { console.log(this.a); } var a=1; foo(); 在代码中,foo()函数不带任何修饰的引用进行调 ...
- inline函数不能在for循环中使用的原因
inline函数的作用继承了宏定义的优点,没有了参数压栈,代码生成等一部分操作,并且摒弃了没有检查编译规则的缺点: 另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在 ...
- msfvenom向apk注入payload
首先安装apt-get install apkinjector 这个东西,msfvenom重新组装apk的时候会自动调用 msfvenom -x /路径/apk android/meterpreter ...
- JAVA开发中遇到的异常总结
最常见的五种异常:必会,面试题: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数 ...
- Oracle_where子句
Oracle_where子句 --1.查询员工名为'SMITH'的信息 select * from emp where ename = 'SMITH'; --2.查询在1980/12/17入职的员 ...
- ZooKeeper 分布式共享锁的实现
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/8352919.html ------------------------------------ ...
- Code4 APP
MJExtension 斯坦福大学公开课
- Node.js进阶:5分钟入门非对称加密方法
前言 刚回答了SegmentFault上一个兄弟提的问题<非对称解密出错>.这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下. 非对称加密的理 ...