算法分析:
/*
分析此问题可知,为最长子序列(LCS)问题的变形。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;
}
原文地址:http://blog.csdn.net/ztzi321/article/details/41967317