Huaman Gene Functions

算法分析:

/*

  分析此問題可知,爲最長子序列(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;
}



   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章