算法分析:
/*
分析此問題可知,爲最長子序列(LCS)問題的變形。假設兩個子序列分別是X,Y;
Xi=(x1,x2...xi),Yj=(y1,y2..yj)分別是兩個子序列的前i,j個子序列
求最長子序列;
1、當xi=yj時,dp[i][j]=dp[i-1][j-1]+1
2、當xi!=yj時,則dp[i][j]=max(dp[i-1][j],dp[i][j-1]).
對於本題來說是變種LCS.
設dp[i][j]爲取s1第i個字符,s2第j個字符時的最大分值
則決定dp爲最優的情況有三種(matrix[][]爲s1[i]和s2[j]兩符號的分數):
1、 s1取第i個字母,s2取“ - ”: dp[i-1][j]+matrix[ s1[i] ]['-'];
2、 s1取“ - ”,s2取第j個字母:dp[i][j-1]+matrix['-'][ s2[j] ];
3、 s1取第i個字母,s2取第j個字母:dp[i-1][j-1]+matrix[ s1[i] ][ s2[j] ];
即dp[i][j]=max( dp[i-1][j]+matrix[ s1[i] ]['-'],
dp[i][j-1]+matrix['-'][ s2[j] ],
dp[i-1][j-1]+matrix[ s1[i] ][ s2[j] ] );
初始化:
1、dp[0][0]=0;
2、dp[i][0](i屬於(1,s1.length))
dp[i][0]=matrix[s1[i]]['-'];
dp[0][j](j屬於(1,s2.length))
dp[0][j]=matrix['-'][s2[j]]
注:matrix[][]可以定義爲int型的數組,此處只是爲了方便描述而將數組維數值用字符來代替。
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAXVALUE 101
using namespace std;
int switchint(char t)
{
if(t=='A')
return 0;
if(t=='C')
return 1;
if(t=='G')
return 2;
if(t=='T')
return 3;
if(t=='-')
return 4;
}
int getmaxs(int x,int y,int z)
{
int temp;
if(x>y)
temp=x;
else
temp=y;
return temp>z? temp:z;
}
int main()
{
int length1,length2; //分別記錄s1和s2序列長度
int times;//循環次數
char s1[MAXVALUE];
char s2[MAXVALUE];
int dp[MAXVALUE][MAXVALUE];//用來記錄總長子列長度
//首先我們先創建一個matrix二維整形數組來記錄score
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,0
};
// *我們用0來表示
//此函數用來將字符轉換成整形數值,目的是方便構建matrix整形數組
cin>>times;
while(times--)
{
cin>>length1;
for(int i=1;i<=length1;i++)
cin>>s1[i];
cin>>length2;
for(int i=1;i<=length2;i++)
cin>>s2[i];
// #region 初始化
memset(dp, 0, sizeof (dp));
for(int i=1;i<=length1;i++)
{
int temp=switchint(s1[i]);
dp[i][0]=dp[i-1][0]+matrix[temp][4];
}
for(int j=1;j<=length2;j++)
{
int temp=switchint(s2[j]);
dp[0][j]=dp[0][j-1]+matrix[4][temp];
}
//#endregion
for(int i=1;i<=length1;i++)
{
for(int j=1;j<=length2;j++)
{
//dp[i][j]=max(dp[i-1][j-1]+matrix[switchint(s1[i])][switchint(s2[j])],dp[i-1][j]+matrix[switchint(s1[i])][4],dp[i][j-1]+matrix[4][switchint(s2[j])]);
int t1=dp[i-1][j-1]+matrix[switchint(s1[i])][switchint(s2[j])];
int t2=dp[i-1][j]+matrix[switchint(s1[i])][4];
int t3=dp[i][j-1]+matrix[4][switchint(s2[j])];
dp[i][j]=getmaxs(t1,t2,t3);
}
}
cout<<dp[length1][length2]<<endl;
//delete []dp;
}
return 0;
}