poj 1080 Human Gene Functions动态规划

本文详细阐述了基于动态规划的基因序列比对算法实现过程,包括初始化、递推公式和边界条件处理,并通过实例展示了算法的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                      Human Gene Functions

1) str1取第i - 1个字母,str2取'-';
    int m1 = gene[i - 1][j] + score[map[str1[i - 1]]][4];

 

2) str1取取'-', str2取第i - 1个字母
    int m2 = gene[i][j - 1] + score[4][map[str2[j - 1]]];

 

3) str1取第i - 1个字母,str2取第 j - 1个字母;
    int m3 = gene[i - 1][j - 1] + score[map[str1[i - 1]]][map[str2[j - 1]]];

 

 gene[i][j] = max(m1, max(m2, m3));

#include <iostream>
#include <algorithm>
using namespace std;
#define size 110

char map[size], str1[size], str2[size];
int gene[size][size];

int score[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 main()
{
	//freopen("in.txt", "r", stdin);
	map['A'] = 0;
	map['C'] = 1;
	map['G'] = 2;
	map['T'] = 3;
	map['-'] = 4;
	int iCase, i, j, len1, len2;
	cin>>iCase;
	while(iCase--){
		cin>>len1>>str1;
		cin>>len2>>str2;
		//i = 0, j = 0时,没有任何基因字母
		gene[0][0] = 0;
		//第一段没有字母时
		for(i = 1; i <= len2; i++)
			gene[0][i] = gene[0][i - 1] + score[4][map[str2[i - 1]]];
		//第二段没有字母时
		for(i = 1; i <= len1; i++)
			gene[i][0] = gene[i - 1][0] + score[map[str1[i - 1]]][4];

		for(i = 1; i <= len1; i++){
			for(j = 1; j <= len2; j++){
				int m1 = gene[i - 1][j] + score[map[str1[i - 1]]][4];
				int m2 = gene[i][j - 1] + score[4][map[str2[j - 1]]];
				int m3 = gene[i - 1][j - 1] + score[map[str1[i - 1]]][map[str2[j - 1]]];
				gene[i][j] = max(m1, max(m2, m3));
			}
		}
		cout<<gene[len1][len2]<<endl;
	}
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值