1. 程式人生 > >nyoj246 Human Gene Functions dp

nyoj246 Human Gene Functions dp

最長子序列變形,用dp[i][j]表示長度為i時的str1和長度為j的時str2的最大匹配值。 故dp[0][0]為0,但如果只有i或j為一個0時不一定為0,因為兩個序列的長度必須相等所以此時需要通過新增'-'實現。 當i,j都不為0時有三種情況:1.i用'-'填補。2.j用'-'填補。3.都不用'-'填補  ps:不存在都用'-'的情況。不然序列的長度都趨於無限了。 //這種方法新增'-'後怎麼確定str1和str2的長度一定相等這部分沒懂。

#include <bits/stdc++.h>
#define maxn 105
using namespace std;
char str1[maxn],str2[maxn];
int dp[maxn][maxn];
int matrix[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,-maxn,
};
int f(char s){
	switch(s){
		case 'A':return 0;
		case 'C':return 1;
		case 'G':return 2;
		case 'T':return 3;
		case '-':return 4;
	} 
}
int max(int a,int b,int c){
	if(a>=b&&a>=c) return a;
	if(b>=a&&b>=c) return b;
	return c;
}
int main(){
	int n;
	cin>>n;
	while(n--){
		memset(dp,0,sizeof(dp));
		int l1,l2;
		cin>>l1>>str1>>l2>>str2;
		dp[0][0]=0;
		for(int i=1;i<=l1;i++)
		dp[i][0]=dp[i-1][0]+matrix[f(str1[i-1])][f('-')];
		for(int i=1;i<=l2;i++)
		dp[0][i]=dp[0][i-1]+matrix[f('-')][f(str2[i-1])];
		int maxx=-maxn;
		for(int i=1;i<=l1;i++){
			for(int j=1;j<=l2;j++){
				int d1=dp[i-1][j]+matrix[f(str1[i-1])][f('-')];
				int d2=dp[i][j-1]+matrix[f('-')][f(str2[j-1])];
				int d3=dp[i-1][j-1]+matrix[f(str1[i-1])][f(str2[j-1])];
				dp[i][j]=max(d1,d2,d3);
			}
		}
		cout<<dp[l1][l2]<<endl;
	}
}