[]線形ダイナミックプログラミング類似遺伝子

良い思考方程式は、この問題で初期化私は非常に長い時間を取得します

これがあることを忘れないで

#include <cstdioを> 
する#include <cstdlib> 
の#include <iostreamの>  
する#include <CStringの> 
 使用して 名前空間STD。
int型のN1、N2;
CONSTの INT N = 103 チャーS1 [N]、S2 [N]。
INT D1 [N]、D2 [N]。
CONST  INTのタブ[ 5 ] [ 5 ] = 
{ 
    { 5、 - 1、 - 2、 - 1、 - 3 }、
    { - 15、 - 3 - 、 - 2、 - 4 }、
    { - 2、 - 35、 - 2 - 2 }、
    { - 1、 - 2 - 25、 - 1 }、
    { - 3、 - 4、 - 2、 - 10 } 
}。
INT F [N]、[N]。

INT メイン()
{ 
    scanf関数(" %D%S "、&​​N1、S1 + 1 )。
    scanf関数(" %D%sの"&N2、S2 + 1 のためにint型 I = 1 iは= N1 <; iは++ 
    { 
        場合(S1 [i]が== ' A ')のD1 [I] = 0 そう であれば(S1 [i]は= = ' C ')のD1 [I] = 1 そう であれば(S1 [i]が== ' G ')D1 [I] = 2 ;
         そう であれば(S1 [i]が== ' T ')D1 [I] = 3 ; 
    } 
    ためINTi = 1 ; iが= N2 <; iは++ 
    { 
        場合(S2 [i]が== ' A ')D2 [I] = 0 ;
        そう であれば(S2 [i]が== ' C ')のD2 [I] = 1 そう であれば(S2 [i]が== ' G ')D2 [I] = 2 ;
        そう であれば(S2 [i]が== ' T ')のD2 [I] = 3 ; 
    } 
        
    のmemset(F、 - 0x3fをはsizeof (F))。
    F [ 0 ] [0 ] = 0 ; 以下のためにint型 i = 1 ; iは= N2 <; iは++)[F 0 ] [i]は= F [ 0 ] [I- 1 ] +タブ[D2 [I] [ 4 ]以下のためにint型 I = 1 [I]が[F iは++; iは= N1 <)0 ] Fを= [I- 1 ] [ 0 ] +タブ[D1 [I] [ 4 ]
    
    以下のために int型 i = 1 ; iは= N1 <; I ++のための INT J = 1 ; J <= N2とを、jは++
    { 
        F [I] [J][I-F = MAX(1 ] [J- 1 ] + タブ[D1 [I] [D2 [J]、
            MAX(F [I - 1 ] [J] +タブ[D1 [i]は] [ 4 ]、F [i]は[J- 1 ] +タブ[D2 [J] [ 4 ]))。
        // のprintf( "%D%D%D \ n"は、[I-1] F [J-1] +タブ[D1 [I] [D2 [J]、[I-1] [j]はF +タブ[D1 [I] [4]、F [i]は[J-1] +タブ[D2 [J] [4])。
        // のprintf(F "%Dを\ n"、[I] [J])。
    } 
    
    のprintf(" %Dを\ n " 、F [N1] [N2])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/xwww666666/p/11357493.html