zoukankan      html  css  js  c++  java
  • 【bzoj2764】[JLOI2011]基因补全 dp+高精度

    题目描述

    在生物课中我们学过,碱基组成了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("
    ");
        }
    }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;
    }

     

  • 相关阅读:
    PHP 5.5.0 Alpha5 发布
    Ubuntu Touch 只是另一个 Android 皮肤?
    MariaDB 10 已经为动态列提供文档说明
    Percona Toolkit 2.1.9 发布,MySQL 管理工具
    Oracle Linux 6.4 发布
    Ruby 2.0.0 首个稳定版本(p0)发布
    Apache Pig 0.11.0 发布,大规模数据分析
    Node.js 0.8.21 稳定版发布
    红薯 MySQL 5.5 和 5.6 默认参数值的差异
    Django 1.5 正式版发布,支持 Python 3
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6764373.html
Copyright © 2011-2022 走看看