hdu1080(最长公共子序列变形)

来源:互联网 发布:二维数组整体排序java 编辑:程序博客网 时间:2024/05/22 02:14

给定一个相似性矩阵

给定两个基因序列(由AGCT组成),填充空格‘ ’,使得相似性分数最高

状态转移,其中dp[i,j]表示s1[i]和s2[j]处能取到的最大分数(i=1,2,3...len1,j=1,2,3,..,len2)

dp[i,j]=max(max(dp[i-1,j-1]+table[i,j],dp[i,j-1]+table[i]['-']),dp[i-1,j]+table['-'][j])

注意初始化

  for(int i=1;i<=l1;i++)  dp[i][0]=dp[i-1][0]+table[t1[i]][4];        for(int i=1;i<=l2;i++)  dp[0][i]=dp[0][i-1]+table[4][t2[i]];

代码

#include <iostream>#include <stdio.h>using namespace std;const int maxn=105;int table[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 transfer(char c){    if(c=='A')return 0;    if(c=='C')return 1;    if(c=='G')return 2;    if(c=='T')return 3;    return 4;}int main(){    //freopen("in.txt","r",stdin);    char s1[maxn],s2[maxn];    int t1[maxn],t2[maxn];    int dp[maxn][maxn];    int l1,l2;    int T;    scanf("%d",&T);    while(T--){        //dp[0][0]=dp[1][0]=dp[0][1]=0;        scanf("%d ",&l1);        for(int i=1;i<=l1;i++){            scanf("%c",&s1[i]);            t1[i]=transfer(s1[i]);        }        scanf("%d ",&l2);        for(int i=1;i<=l2;i++){            scanf("%c",&s2[i]);            t2[i]=transfer(s2[i]);        }        dp[0][0]=0;        for(int i=1;i<=l1;i++)  dp[i][0]=dp[i-1][0]+table[t1[i]][4];//注意开头是可以填空格的        for(int i=1;i<=l2;i++)  dp[0][i]=dp[0][i-1]+table[4][t2[i]];        for(int i=1;i<=l1;i++){            for(int j=1;j<=l2;j++){                 dp[i][j]=max(dp[i-1][j-1]+table[t1[i]][t2[j]],max(dp[i-1][j]+table[t1[i]][4],dp[i][j-1]+table[4][t2[j]]));            }        }        printf("%d\n",dp[l1][l2]);    }    return 0;}


0 0
原创粉丝点击