标签:匹配 不同的 ati 并且 data scan 数据 out dna
题目描述
输入
输出
样例输入
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+高精度
标签:匹配 不同的 ati 并且 data scan 数据 out dna
原文地址:http://www.cnblogs.com/GXZlegend/p/6764373.html