您的位置:首页 > 其它

POJ - 1080 - Human Gene Functions (LCS的变形)

2015-05-04 23:21 204 查看
题目传送:Human Gene Functions

思路:LCS的变形,定义状态dp[ i ][ j ]为取字符串s前i个字符字符串t前j个字符所获得的最大值,则可以得到状态转移方程为:

dp[ i ][ j ] = max(dp[ i ][ j - 1] + f[ ' - ' ][ t[ j ] ], dp[ i - 1 ][ j ] + f[ s [ i ] ][ ' - ' ], dp[i - 1][ j - 1] + f[ s [ i ] ][ t [ j ] ]);

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

char s[105];
char t[105];
int len1, len2;
int f[105][105];

int dp[105][105];

void init() {
	f['A']['A'] = 5; f['A']['C'] = -1; f['A']['G'] = -2; f['A']['T'] = -1; f['A']['-'] = -3;
	f['C']['A'] = -1; f['C']['C'] = 5; f['C']['G'] = -3; f['C']['T'] = -2; f['C']['-'] = -4;
	f['G']['A'] = -2; f['G']['C'] = -3; f['G']['G'] = 5; f['G']['T'] = -2; f['G']['-'] = -2;
	f['T']['A'] = -1; f['T']['C'] = -2; f['T']['G'] = -2; f['T']['T'] = 5; f['T']['-'] = -1;
	f['-']['A'] = -3; f['-']['C'] = -4; f['-']['G'] = -2; f['-']['T'] = -1;	
}

int main() {
	init();
	int T;
	scanf("%d", &T);
	while(T --) {
		scanf("%d %s", &len1, s + 1);
		scanf("%d %s", &len2, t + 1);
		dp[0][0] = 0;
		for(int i = 1; i <= len1; i ++) {
			dp[i][0] = dp[i-1][0] + f[s[i]]['-'];
		}
		for(int i = 1; i <= len2; i ++) {
			dp[0][i] = dp[0][i-1] + f['-'][t[i]];
		}
		for(int i = 1; i <= len1; i ++) {
			for(int j = 1; j <= len2; j ++) {
				int t1 = dp[i][j-1] + f['-'][t[j]];
				int t2 = dp[i-1][j] + f[s[i]]['-'];
				int t3 = dp[i-1][j-1] + f[s[i]][t[j]];
				dp[i][j] = max(t1, max(t2, t3));
			}
		}
		cout << dp[len1][len2] << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: