//11175259 c00h00g 1080 Accepted 640K 0MS G++ 1444B 2013-01-14 16:18:02
//题意:根据给定的矩阵,求两个字符串的最大相似度
//转移方程为 dp[i][j]=max(dp[i-1][j-1]+mat[a[i]][b[j]],dp[i][j-1]+mat['-'][b[j]],dp[i-1][j]+mat['-'][a[i]]);
//边界:dp[0][0]=0,dp[i][0]表示a数组的前i个字符和'-'匹配得到的值,dp[0][i]表示b数组的前i个字符和'-'匹配后的字符
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<algorithm>
using namespace std;
int dp[105][105];
int T,n1,n2;
char a[105],b[105];
map<char,int> Map;
int mat[6][6];
void init(){
Map['A']=1;
Map['C']=2;
Map['G']=3;
Map['T']=4;
Map['-']=5;
mat[1][1]=mat[2][2]=mat[3][3]=mat[4][4]=5;
mat[1][2]=mat[2][1]=-1;
mat[1][3]=mat[3][1]=-2;
mat[1][4]=mat[4][1]=-1;
mat[1][5]=mat[5][1]=-3;
mat[2][3]=mat[3][2]=-3;
mat[2][4]=mat[4][2]=-2;
mat[2][5]=mat[5][2]=-4;
mat[3][4]=mat[4][3]=-2;
mat[3][5]=mat[5][3]=-2;
mat[4][5]=mat[5][4]=-1;
//初始化dp[i][0]
dp[0][0]=0;
int sum=0;
for(int i=1;i<=n1;i++){
sum+=mat[Map[a[i]]][Map['-']];
dp[i][0]=sum;
}
sum=0;
for(int i=1;i<=n2;i++){
sum+=mat[Map['-']][Map[b[i]]];
dp[0][i]=sum;
}
}
int max3(int a,int b,int c){return max(a,max(b,c));}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n1); scanf("%s",a+1);
scanf("%d",&n2); scanf("%s",b+1);
init();
for(int i=1;i<=n1;i++){
for(int j=1;j<=n2;j++){
dp[i][j]=max3(dp[i-1][j-1]+mat[Map[a[i]]][Map[b[j]]],
dp[i][j-1]+mat[Map[b[j]]][Map['-']],
dp[i-1][j]+mat[Map['-']][Map[a[i]]]);
}
}
printf("%d\n",dp[n1][n2]);
}
return 0;
}
POJ 1080 dp
最新推荐文章于 2013-04-07 16:44:24 发布