现在的位置: 首页 > 综合 > 正文

hdu 1080 DP

2013年10月12日 ⁄ 综合 ⁄ 共 929字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstdio>
using namespace std;

inline int max( int a, int b, int c ){
	int maxi = a;
	maxi = ( maxi > b ? maxi : b );
	maxi = ( maxi > c ? maxi : c );
	return maxi;
}

int main(){
	int score[6][6] = {
		0, 0, 0, 0, 0, 0,
		0, 5, -1, -2, -1, -3,
		0, -1, 5, -3, -2, -4,
		0, -2, -3, 5, -2, -2,
		0, -1, -2, -2, 5, -1,
		0, -3, -4, -2, -1, -100000
	};
	int t, n1, n2;
	char c1[101], c2[101];
	int a1[101], a2[101], dp[101][101];

	cin >> t;
	while( t-- ){
		cin >> n1;
		scanf( "%s", c1 + 1 );
		for( int i = 1; i <= n1; i++ ){
			if( c1[i] == 'A' ) a1[i] = 1;
			else if( c1[i] == 'C' ) a1[i] = 2;
			else if( c1[i] == 'G' ) a1[i] = 3;
			else a1[i] = 4;
		}
		cin >> n2;
		scanf( "%s", c2 + 1 );
		for( int i = 1; i <= n2; i++ ){
			if( c2[i] == 'A' ) a2[i] = 1;
			else if( c2[i] == 'C' ) a2[i] = 2;
			else if( c2[i] == 'G' ) a2[i] = 3;
			else a2[i] = 4;
		}
		dp[0][0] = 0;
		for( int i = 1; i <= n1; i++ ){
			dp[i][0] = dp[i-1][0] + score[a1[i]][5];
		}
		for( int i = 1; i <= n2; i++ ){
			dp[0][i] = dp[0][i-1] + score[5][a2[i]];
		}
		for( int i = 1; i <= n1; i++ ){
			for( int j = 1; j <= n2; j++ ){
				dp[i][j] = max( dp[i-1][j-1] + score[a1[i]][a2[j]], dp[i][j-1] + score[5][a2[j]], dp[i-1][j] + score[a1[i]][5] );
			}
		}
		cout << dp[n1][n2] << endl;
	}
	return 0;
}

 

抱歉!评论已关闭.