给出两个串,根据给出的字符之间的相似度 求 最大相似度。。
很明显的 LCS变形,只要注意下 初始条件就可以了
#include<stdio.h>
#include<string.h>
#define max(a,b,c) ((a)>(b)?(a)>(c)?(a):(c):(b)>(c)?(b):(c))
const int maxn=105;
char s[maxn],t[maxn];
int dp[maxn][maxn];
int slen,tlen;
char map[]={'A','C','G','T'};
int table[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 getid(char c){
for(int i=0;i<4;i++)if(map[i]==c)return i;
return 0;
}
int main(){
int n;
scanf("%d",&n);
while(n--){
scanf("%d%s",&slen,s);
scanf("%d%s",&tlen,t);
int ids,idt;
dp[0][0]=0;
for(int i=0;i<slen;i++){
ids=getid(s[i]);
dp[i+1][0]=dp[i][0]+table[ids][4];
for(int j=0;j<tlen;j++){
idt=getid(t[j]);
dp[0][j+1]=dp[0][j]+table[4][idt];
int a=dp[i+1][j]+table[4][idt];
int b=dp[i][j+1]+table[ids][4];
int c=dp[i][j]+table[ids][idt];
dp[i+1][j+1]=max(a,b,c);
}
}
printf("%d\n",dp[slen][tlen]);
}
}