/*
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;
}
洛谷 P1140 相似基因(动态规划)
猜你喜欢
转载自www.cnblogs.com/TonyLiang2018/p/9094257.html
今日推荐
周排行