poj1080 最长公子序列变形(注意初始化)

来源:互联网 发布:淘宝星级查询 编辑:程序博客网 时间:2024/04/27 18:23

刚拿到这道题目,不知道从何处下手,完全被'-'搞的不知道怎么办,其实和最长公子序列思维类似,只不过在两个序列长度分别为i,j时,有三种决策。还有就是此题目在初始化时与最长公子序列不同,比如上面的空了,那么下边的每一个剩余字母都要与'-'匹配,而且是一个累加值。

#include<iostream>
using namespace std;
int upnum,downnum;
char up[110];
char down[110];
int ls[6][6]={  {0,0,0,0,0,0},
                {0,5,-1,-2,-1,-3},
                {0,-1,5,-3,-2,-4},
                {0,-2,-3,5,-2,-2},
                {0,-1,-2,-2,5,-1},
                {0,-3,-4,-2,-1,0} };
int dp[110][110];
int max(int x,int y,int z)
{  
    int maxx;
    if(x>y)
    maxx=x;
    else
    maxx=y;
    if(maxx<z)
    return z;
    else return maxx;
}
int trans(char x)
{
    if(x=='A')
    return 1;
    if(x=='C')
    return 2;
    if(x=='G')
    return 3;
    if(x=='T')
    return 4;
    if(x=='-')
    return 5;
}
int val(char a,char b)
{
    int p=trans(a);
    int q=trans(b);
    return ls[p][q];
}
   
int main()
{
    int T,i,j;
    scanf("%d%*c",&T);
    while(T-->0)
    {
           scanf("%d%*c",&upnum);
           scanf("%s%*c",up);
           scanf("%d%*c",&downnum);
           scanf("%s%*c",down);
           dp[0][0]=0;


           for(i=1;i<=upnum;i++)
           dp[i][0]=val(up[i-1],'-')+dp[i-1][0];
           for(j=1;j<=downnum;j++)
           dp[0][j]=val('-',down[j-1])+dp[0][j-1];

           //某一串空了,则另一串所剩余的每一个字母都要与'-'匹配,而且是一个累加值。
           for(i=1;i<=upnum;i++)
           for(j=1;j<=downnum;j++)
           dp[i][j]=max(dp[i-1][j-1]+val(up[i-1],down[j-1]),dp[i-1][j]+val(up[i-1],'-'),dp[i][j-1]+val('-',down[j-1]));
           cout<<dp[upnum][downnum]<<endl;
    }
    system("pause");
    return 0;
}     

原创粉丝点击