hdu 1080 Human Gene Functions 夜

二维DP

先把四种字符映射成整数 空格为 4  然后将对应的相似程度值存入

sim 数组中以便查找

ans[i][j] 表示 a 中第 i 个与 b 中第 j 个为最后时的最大相似程度值

其中包括 a[i] 与 b[j]成对 a[i]与 空格成对 空格与b[j]成对三种情况

要取最大的一种情况

以 0 0 为截止点

http://acm.hdu.edu.cn/showproblem.php?pid=1080

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>

using namespace std;

int sim[5][5]={5,-1,-2,-1,-3,-1,5,-3,-2,-4,-2,-3,5,-2,-2,-1,-2,-2,5,-1,-3,-4,-2,-1,0};
int ans[101][101];
char s[102];
int a[102];
int b[102];
int dp(int i,int j)
{
    if(ans[i][j]!=-1)//已计算出
    return ans[i][j];
    if(!i&&!j)//截止情况
    {
        ans[i][j]=0;
        return ans[i][j];
    }
    if(!i)
    {
       ans[i][j]=dp(i,j-1)+sim[4][b[j]];
       return ans[i][j];
    }
    if(!j)
    {
        ans[i][j]=dp(i-1,j)+sim[a[i]][4];
        return ans[i][j];
    }
    if(i>0&&j>0)//重点在这里哟 亲
    {
        ans[i][j]=max(sim[a[i]][b[j]]+dp(i-1,j-1),max(sim[a[i]][4]+dp(i-1,j),sim[4][b[j]]+dp(i,j-1)));
        return ans[i][j];
    }

}
int main()
{

    //freopen("D:\\6\\bin\\Debug\\hu.txt","r",stdin );

    int T,n,m,i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        scanf("%s",s);
        for(i=0;i<n;i++)
        if(s[i]=='A')
        {
            a[i+1]=0;
        }else if(s[i]=='C')
        {
            a[i+1]=1;
        }else if(s[i]=='G')
        {
            a[i+1]=2;
        }else
        {
            a[i+1]=3;
        }
        scanf("%d",&m);
        scanf("%s",s);
        for(i=0;i<m;i++)
        if(s[i]=='A')
        {
            b[i+1]=0;
        }else if(s[i]=='C')
        {
            b[i+1]=1;
        }else if(s[i]=='G')
        {
            b[i+1]=2;
        }else
        {
            b[i+1]=3;
        }
        memset(ans,-1,sizeof(ans));
        printf("%d\n",dp(n,m));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/liulangye/p/2266698.html