题目描述

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

输入

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

输出

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

样例输入

10 3
CTAGTAGAAG
TCC

样例输出

4


题解

高中生物 dp+高精度

根据碱基互补配对原则,S的互补链是确定的,所以所求转化为在S的互补链中依次选择m个不同种碱基。。。

设f[i]为将T串的前i个选完的方案数。

那么对于S中的位置i和T中的位置j,如果它们互补,则更新答案,f[j]+=f[j-1]。

注意需要倒着循环,因为S串中的每个碱基只能用一次。

注意需要高精度。

#include <cstdio>
#define mod 100000000
char s1[2010] , s2[2010];
struct data
{
int len , num[100];
data operator+=(const data a)
{
int i;
for(i = 0 ; i < len || i < a.len || num[i] ; i ++ )
num[i] += a.num[i] , num[i + 1] += num[i] / mod , num[i] %= mod;
len = i;
return *this;
}
void output()
{
int i;
printf("%d" , num[len - 1]);
for(i = len - 2 ; i >= 0 ; i -- )
printf("%08d" , num[i]);
printf("\n");
}
}f[2010];
bool judge(char a , char b)
{
return (a == 'A' && b == 'T') || (a == 'G' && b == 'C') || (a == 'C' && b == 'G') || (a == 'T' && b == 'A');
}
int main()
{
int n , m , i , j;
scanf("%d%d%s%s" , &n , &m , s1 + 1 , s2 + 1);
f[0].len = f[0].num[0] = 1;
for(i = 1 ; i <= n ; i ++ )
for(j = m ; j ; j -- )
if(judge(s1[i] , s2[j]))
f[j] += f[j - 1];
f[m].output();
return 0;
}

【bzoj2764】[JLOI2011]基因补全 dp+高精度的更多相关文章

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

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

  2. BZOJ2764 [JLOI2011]基因补全

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

  3. 2764: [JLOI2011]基因补全

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

  4. [JLOI2011]基因补全

    1973: [JLOI2011]基因补全 Time Limit: 1 Sec  Memory Limit: 256 MB Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸), ...

  5. bzoj2764 基因补全

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

  6. bzoj 1089 [SCOI2003]严格n元树(DP+高精度)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1250  Solved: 621[Submit][Statu ...

  7. [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度

    https://www.luogu.org/problem/show?pid=1005   dp好想,高精度练手题,有点不舒服的是前后取数位置的计算,代码量太少才会写题这么慢,noip之前虽然重点放在 ...

  8. Oracle补全日志(Supplemental logging)

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

  9. python 添加tab补全

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

随机推荐

  1. Docker 入坑教程笔记

    Docker 入坑教程笔记 视频网址B站:点这里 查询命令 man docker 简单启动和退出 docker run --name [容器名] -i -t ubuntu /bin/bash 交互启动 ...

  2. python3笔记

    python3 Python3 基本数据类型 Python 中有六个标准的数据类型: Numbers(数字) Python可以同时为多个变量赋值,如a, b = 1, 2. 一个变量可以通过赋值指向不 ...

  3. plsql 连接数据库无法解析指定的连接标识符

    之前用plsql连接的时候一直出问题,报无法解析指定的连接标识符,但是我加上ip地址就可以连接上. 我百度了很久,有说如下图选择oracle home的,有说清空admin目录下的所有文件, 但是都不 ...

  4. 8.2 USB键盘驱动编写和测试

    目标:根据USB驱动分析和上节的USB鼠标驱动,编写键盘驱动,并测试. 一.原理分析 1. 首先通过打印usb_buf[i]中的8字节数据,看一下按键按下之后会接收到什么. 1)通过按完所有键盘按键打 ...

  5. python3爬虫之开篇

    写在前面的话: 折腾爬虫也有一段时间了,从一开始的懵懵懂懂,到现在的有一定基础,对于这一路的跌跌撞撞,个人觉得应该留下一些文字性的东西,毕竟好记性不如烂笔头,而且毕竟这是吃饭的家伙,必须用心对待才可以 ...

  6. django开发傻瓜教程-3-celery异步处理

    Ref: https://www.jianshu.com/p/6f8576a37a3e https://blog.csdn.net/Demo_3/article/details/78119951 ht ...

  7. python学习之面向对象程序设计的一些思考

    将属于一类的对象放在一起: 如果一个函数操纵一个全局变量,那么两者最好都在类内作为特性和方法实现. 不要让对象过于亲密: 方法应该只关心自己实例的特性,让其他实例管理自己的状态. 简单就好: 让方法小 ...

  8. chromedriver各个版本的下载

    驱动的下载地址如下: http://chromedriver.storage.googleapis.com/index.html 注意:64位向下兼容,直接下载32位的就可以啦,亲测可用.

  9. Python自动化运维——文件与目录差异对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:filecmp 安装:Python版本大于等于2.3默认自带 功能:实现文件.目录.遍历子目录的差异 常用方 ...

  10. SapScript

    * [OPEN_FORM] SAPscript: フォーム印刷の開始 * [START_FORM] SAPscript: 書式を開始 * [WRITE_FORM] SAPscript: 書式ウィンドウ ...