• 【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;
    }

     

  • 相关阅读:
    Springboot 配置Slf4j + Logback
    一步一步创建SpringCloud项目(二)—— 使用feign和ribbon调用微服务
    一步一步创建SpringCloud项目(一)——创建项目父工程、Eureka
    rabbitmq使用笔记
    docker部署rabbitmq
    Maven pom文件中dependency scope用法
    MySQL事务隔离级别总结
    docker安装redis
    RabbitMQ的消息确认机制
    centos7.6 下安装docker,docker compose
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6764373.html
Copyright © 2020-2023  润新知