洛谷 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;
}
posted @ 2018-05-26 20:50  TonyLiang2018  阅读(242)  评论(0)    收藏  举报