zoukankan      html  css  js  c++  java
  • BZOJ_2764_[JLOI2011]基因补全_DP_高精度

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

    Description

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

    Input

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

    Output

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

    Sample Input

    10 3
    CTAGTAGAAG
    TCC

    Sample Output

    4

    设f[i]表示匹配到序列T的第i个字符的方案数。
    然后对S的每一位倒序枚举T,如果匹配到就F[j]+=F[j-1]。
    需要高精度加法。
     
    代码:
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define N 2050
    #define mod 100000000
    int n,m;
    char s[N],w[N];
    struct Big {
        int a[250],len;
        Big() {memset(a,0,sizeof(a)); len=0;}
        Big operator + (const Big &x) const {
            Big re; int l=max(len,x.len),jin=0,i;
            for(i=1;i<=l;i++) {
                int tmp=a[i]+x.a[i]+jin;
                jin=tmp/mod; re.a[i]=tmp%mod;
            }
            if(jin) l++;
            re.len=l; re.a[l]+=jin;
            return re;
        }
        void output() {
            printf("%d",a[len]);
            int i;
            for(i=len-1;i;i--) printf("%08d",a[i]);
        }
    }f[N];
    bool check(int i,int j) {
        return (s[i]=='T'&&w[j]=='A')||(s[i]=='A'&&w[j]=='T')||(s[i]=='C'&&w[j]=='G')||(s[i]=='G'&&w[j]=='C');
    }
    int main() {
        scanf("%d%d%s%s",&n,&m,s+1,w+1);
        int i,j; f[0].len=f[0].a[1]=1;
        for(i=1;i<=m;i++) f[i].len=1;
        for(i=1;i<=n;i++) {
            for(j=m;j;j--) {
                if(check(i,j)) f[j]=f[j]+f[j-1];
            }
        }
        f[m].output();
    }
    
  • 相关阅读:
    最优匹配问题
    树的最大独立集
    koa2学习(一)
    vue源码阅读(一)
    一直以为错的一个问题,记录一下
    关于 vuex 的使用忠告
    《javascript设计模式与开发实践》--- (单一职责原则)
    心累
    node 学习(二)
    node 学习(一)
  • 原文地址:https://www.cnblogs.com/suika/p/9062816.html
Copyright © 2011-2022 走看看