[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来实现一下. 博主原创代码,如有代码写的不完善的地方还望大家多 ...
随机推荐
- MySQL在并发场景下的问题及解决思路
目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 1.背景 对于数据库系统来说在多用户并发条件下提高并发性的同时又要保 ...
- 3.If statements
if 语句 电脑程序不只是执行命令.时常会需要做出选择.例如基于一个条件的选择.Python有这样几种条件运算: > greater than < smaller than ...
- python将数据写入excel代码,python与office交互
# -*- coding: utf-8 -*- from smartframe.header import * import pymysql import json import importlib, ...
- keynote 代码高亮
brew install highlight (同时会安装 Lua 和 Boost) highlight -K 18 -s Vampire -u 'utf-8' -O rtf test.html | ...
- 固定sql语句传参批量查询数据库脚本
#!/usr/bin/env python # encoding: utf-8 import pandas as pd import psycopg2 conn_dv = psycopg2.conne ...
- Coursera课程 Programming Languages 总结
课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...
- 爬虫、请求库selenium
阅读目录 一 介绍 二 安装 三 基本使用 四 选择器 五 等待元素被加载 六 元素交互操作 七 其他 八 项目练习 一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决r ...
- SQL数据开发(经典) 基本操作
数据开发(经典) 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str oke_ci_as ...
- CTF---Web入门第八题 Guess Next Session
Guess Next Session分值:10 来源: iFurySt 难度:易 参与人数:3870人 Get Flag:1672人 答题人数:1690人 解题通过率:99% 写个算法没准就算出来了, ...
- hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)
#1053 : 居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直 ...