算法分析:
/*
分析此问题可知,为最长子序列(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