【线性动态规划】相似基因

方程挺好想的,就是本题的初始化我弄了挺久

不是忘了这个就是那个

#include<cstdio>
#include<cstdlib>
#include<iostream> 
#include<cstring> 
using namespace std;
int n1,n2;
const int N=103;
char s1[N],s2[N];
int d1[N],d2[N];
const int tab[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 f[N][N];

int main()
{
    scanf("%d%s",&n1,s1+1);
    scanf("%d%s",&n2,s2+1);
    for(int i=1;i<=n1;i++)
    {
        if(s1[i]=='A') d1[i]=0;
        else if(s1[i]=='C') d1[i]=1;
        else if(s1[i]=='G') d1[i]=2;
        else if(s1[i]=='T') d1[i]=3;
    }
    for(int i=1;i<=n2;i++)
    {
        if(s2[i]=='A') d2[i]=0;
        else if(s2[i]=='C') d2[i]=1;
        else if(s2[i]=='G') d2[i]=2;
        else if(s2[i]=='T') d2[i]=3;
    }
        
    memset(f,-0x3f,sizeof(f));
    f[0][0]=0;for(int i=1;i<=n2;i++) f[0][i]=f[0][i-1]+tab[d2[i]][4];
    for(int i=1;i<=n1;i++) f[i][0]=f[i-1][0]+tab[d1[i]][4];
    
    for(int i=1;i<=n1;i++)
        for(int j=1;j<=n2;j++)
    {
        f[i][j]=max(f[i-1][j-1]+tab[d1[i]][d2[j]],
            max(f[i-1][j]+tab[d1[i]][4],  f[i][j-1]+tab[d2[j]][4]) );
        //printf("%d %d %d\n",f[i-1][j-1]+tab[d1[i]][d2[j]],f[i-1][j]+tab[d1[i]][4],f[i][j-1]+tab[d2[j]][4]);
        //printf("%d\n",f[i][j]);
    }
    
    printf("%d\n",f[n1][n2]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xwww666666/p/11357493.html