洛谷 P1140 相似基因 动态规划

dp[i][j]表示a的前i个碱基与b的前j个碱基的最大相似度

(ai,bi)表示碱基ai与bi之间的相似度

状态方程:dp[i][j]=max(dp[i-1][j-1]+(ai,bi),dp[i][j-1]+(-,bj),dp[i-1][j]+(ai,-))

#include<iostream>
#include<cstdio>
using namespace std;
int ff[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[105][105];
char a[105],b[105];
int aa,bb;
int chang(char x)//将字符转化为ff数组对应的下标 
{
    if(x=='A')return 1;if(x=='C')return 2;
    if(x=='G')return 3;if(x=='T')return 4; 
    return 0;
}
int maxx(int a,int b,int c)
{
    int x;
    x=max(a,b);
    x=max(x,c);
    return x;
}
void solve()
{
    int i,j;
    cin>>aa;
    getchar();
    for(i=1;i<=aa;i++)cin>>a[i];
    cin>>bb;
    getchar();
    for(i=1;i<=bb;i++)cin>>b[i];
//    dp[1][0]=ff[chang(a[1])][5];
//    dp[0][1]=ff[5][chang(b[1])];
    for(i=1;i<=aa;i++)dp[i][0]=dp[i-1][0]+ff[chang(a[i])][5];//初始化 
    for(i=1;i<=bb;i++)dp[0][i]=dp[0][i-1]+ff[5][chang(b[i])];//初始化 
    for(i=1;i<=aa;i++)
        for(j=1;j<=bb;j++)
            dp[i][j]=maxx(dp[i-1][j-1]+ff[chang(a[i])][chang(b[j])],dp[i-1][j]+ff[chang(a[i])][5],dp[i][j-1]+ff[5][chang(b[j])]);
    cout<<dp[aa][bb]<<endl;         
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/9990604.html