洛谷 P1140 相似基因(动态规划)

/*
https://www.luogu.org/problemnew/show/P1140
相似基因(动态规划) 
*/
#include <iostream>
#include <map>
using namespace std;

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}
};
map<char, int> mapx;
int la, lb;
string sa, sb;
int da[101], db[101];       //转化为数字的结果
int f[101][101];
const int INF = 0x3f3f3f3f;

int main()
{ 
    cin >> la >> sa >> lb >> sb;
    
    //在这里预处理一波 
    mapx['A'] = 0;
    mapx['C'] = 1;
    mapx['G'] = 2;
    mapx['T'] = 3;
    mapx['-'] = 4;
    for (int i=1; i<=la; i++)
        for (int j=1; j<=lb; j++)
            f[i][j] = -INF;
    
    //转化成数字 
    for (int i=1; i<=la; i++)
        da[i] = mapx[sa[i-1]];
    for (int i=1; i<=lb; i++)
        db[i] = mapx[sb[i-1]];
    
    //特判: 
    //第一/二段的1与第二/一段的0匹配时可视作与空碱基匹配
    //这里很重要 
    for(int i=1;i<=la;i++)
        f[i][0]=f[i-1][0]+tab[da[i]][4];
    for(int i=1;i<=lb;i++)
        f[0][i]=f[0][i-1]+tab[db[i]][4];
    
    for (int i=1; i<=la; i++)
    {
        for (int j=1; j<=lb; j++)
        {
            //a中放空碱基 
            f[i][j] = max(f[i][j], f[i-1][j] + tab[da[i]][4]);
            //b中放空碱基
            f[i][j] = max(f[i][j], f[i][j-1] + tab[db[j]][4]);
            //直接配对 
            f[i][j] = max(f[i][j], f[i-1][j-1] + tab[da[i]][db[j]]);
        }
    }
    
    cout << f[la][lb] << endl;
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/TonyLiang2018/p/9094257.html