POJ 1080 Human Gene Functions DP

注意初始化

View Code
#include<stdio.h>
#include<string.h>
int dp[103][103];
char a[103], b[103];
int f[7][7];
#define inf 1000000000
int max(int a, int b, int c)
{
    int x = a > b ? a : b;
    return x > c ? x : c;
}

void init()
{
    for(int i = 1; i <= 4; i++) f[i][i] = 5;
    f[1][2] = f[2][1] = -1; f[1][3] = f[3][1] = -2;
    f[1][4] = f[4][1] = -1; f[1][5] = f[5][1] = -3;
    f[2][3] = f[3][2] = -3; f[2][4] = f[4][2] = -2;
    f[2][5] = f[5][2] = -4; f[3][4] = f[4][3] = -2;
    f[3][5] = f[5][3] = -2; f[4][5] = f[5][4] = -1;
}

char update(char c)
{
    if(c=='A')return 1;
    if(c=='C')return 2;
    if(c=='G')return 3;
    if(c=='T')return 4;
    if(c=='-')return 5;
}
int main()
{
    int i, j, cas, l1, l2;
    init();
    scanf("%d", &cas);
    while(cas--)
    {
        scanf("%d%s%d%s", &l1, a+1, &l2, b+1);
        for(i = 1; i <= l1; i++)
            a[i] = update(a[i]);
        for(i = 1; i <= l2; i++)
            b[i] = update(b[i]);
        dp[0][0] = 0;
        for(i = 1; i <= l1; i++)
            dp[i][0] = dp[i-1][0] + f[a[i]][5];
        for(j = 1; j <= l2; j++)
            dp[0][j] = dp[0][j-1] + f[5][b[j]];
        for(i = 1; i <= l1; i++)
            for(j = 1; j <= l2; j++)
            {
                int t1 = dp[i-1][j] + f[a[i]][5];
                int t2 = dp[i][j-1] + f[5][b[j]];
                int t3 = dp[i-1][j-1] + f[a[i]][b[j]];
                dp[i][j] = max(t1, t2, t3);
            }
        printf("%d\n", dp[l1][l2]);
    }
    return 0;
}
posted @ 2012-11-14 15:03  To be an ACMan  Views(160)  Comments(0)    收藏  举报