HDU 1080 Human Gene Functions

DP,比较容易想到是2维DP,表示到第一个字符串的i和第二个字符串的j最大值是多少, 字符串下标的0在这里对应的i,j是1



#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=-(1<<29);
char s1[105], s2[105];
int dist[151][151], dp[105][105];
void init()
{
    dist['A']['A']=5;
    dist['A']['C']=dist['C']['A']=-1;
    dist['A']['G']=dist['G']['A']=-2;
    dist['A']['T']=dist['T']['A']=-1;
    dist['A']['-']=dist['-']['A']=-3;
    dist['C']['C']=5;
    dist['C']['G']=dist['G']['C']=-3;
    dist['C']['T']=dist['T']['C']=-2;
    dist['C']['-']=dist['-']['C']=-4;
    dist['G']['G']=5;
    dist['G']['T']=dist['T']['G']=-2;
    dist['G']['-']=dist['-']['G']=-2;
    dist['T']['T']=5;
    dist['T']['-']=dist['-']['T']=-1;
}
int main()
{
    int T, l1, l2, i, j, ti, tj, r1, r2;
    scanf("%d",&T);
    init();
    while(T--)
    {
        scanf("%d%s%d%s",&l1,s1,&l2,s2);
        for(i=0;i<=l1;i++)
            for(j=0;j<=l2;j++)
                dp[i][j]=INF;
        dp[0][0]=0;
        for(i=0;i<l1;i++)
            dp[i+1][0]=dist[s1[i]]['-']+dp[i][0];
        for(i=0;i<l2;i++)
            dp[0][i+1]=dist['-'][s2[i]]+dp[0][i];
        for(i=0;i<l1;i++)
            for(j=0;j<l2;j++)
            {
                ti=i+1, tj=j+1;
                dp[ti][tj]=max(dp[ti][tj],dp[ti-1][tj-1]+dist[s1[i]][s2[j]]);
                dp[ti][tj]=max(dp[ti][tj],dp[ti-1][tj]+dist[s1[i]]['-']);
                dp[ti][tj]=max(dp[ti][tj],dp[ti][tj-1]+dist['-'][s2[j]]);
            }
        printf("%d\n",dp[l1][l2]);
    }
    return 0;
}


posted @ 2013-08-28 09:42  Ink_syk  阅读(116)  评论(0编辑  收藏  举报