良い思考方程式は、この問題で初期化私は非常に長い時間を取得します
これがあることを忘れないで
#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 }、 { - 1、5、 - 3 - 、 - 2、 - 4 }、 { - 2、 - 3、5、 - 2 - 2 }、 { - 1、 - 2 - 2、5、 - 1 }、 { - 3、 - 4、 - 2、 - 1、0 } }。 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 ; }