デイリー質問day23パンチ
分析
DPは、[i] [j]は最初Jと一致する、i番目の前に配列Aと配列Bにおける類似度の最大値を表します
だから、DP方程式は、考えることは簡単です:
1. [i]とB [j]が一致してみよう
2. [i]は、空孔列Bに一致してみよう
3.レッツのB [j]は配列Aのギャップと一致します
DP [I] [J] = MAX(DP [I]、[J]、DP [I-1] [J-1] +フォーム[I] [B [J]、DP [I-1] [J] +フォーム[I]、[5]、DP [I]、[J-1] +形態[5] [B [J])。
それぞれ、初期化のために、それぞれが[i]とB [J]の各々と空の文字列が一致になるように
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 の#define INT長い長 6 の#define MAXN 100 + 10 7 の#define INF 2147483647 8 使用 名前空間STD。 9インラインint型リード() 10 { 11 INT X = 0 。 12 ブール F = 1 。 13 チャー C = GETCHAR()。 14 用(;!isdigit(C)と、c = getchar関数())もし(C == ' - ')、F = 0 。 15 のために(; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C- ' 0 ' 。 16 であれば(F) 、リターンX。 17 リターン 0 - X。 18 } 19インラインボイド書き込み(INT X) 20 { 21 であれば(X < 0){のputchar(' - '); X = - X;} 22 場合(X>9)書き込み(X / 10 )。 23 のputchar(Xの%10 + ' 0 ' )。 24 } 25 int型N、M。 26 チャーS1 [MAXN]、S2 [MAXN]。 27 のint STR1 [MAXN]、STR2 [MAXN]、DP [MAXN] [MAXN]。 28 INTの形態[MAXN] [MAXN] = 29 { 30 { 0、0、0、0、0、0、0 }、 31 { 0、5、 - 1、 - 2、 - 1、 - 3 }、 32 { 0、 - 1、5、 - 3 - 、 - 2 - 4 }、 33 { 0、 - 2、 - 3、5、 - 2 - 2 }、 34 { 0、 - 1、 - 2 - 2、5、 - 1 }、 35 { 0、 - 3 - 、 - 4 - 、 -2、 - 1、0 } 36 }。 37インラインint型 max_four(int型のx、int型の Y、int型 Z、INT O) 38 { 39 リターンMAX(MAX(x、y)は、MAX(Z、O))。 40 } 41 )(主符号付き 42 { 43 N = )(読み取ります。 44 のために(int型 i = 1 ; iが<= N; I ++)は、CIN >> S1 [i]は、 45 、M = )(読み取ります。 46 のための(int型 I =1 ; I <= M; iは++)CIN >> S2 [i]は、 47 のために(int型 i = 1 ; iが<= N I ++ ) 48 のための(INT J = 1 ; J <= M J ++ ) 49 - DP [I] [J] = ; INF 50 のためには、(int型 i = 1 ; iがn = <; iは++ ) 51 { 52 であれば(S1 [i]が== ' A ')STR1を[I] = 1 。 53 他の 場合(S1 [i]が== ' C ')0009 [I] = 2 ; 54 他の 場合(S1 [i]が== ' G ')0009 [I] = 3 ; 55 他の 場合(S1 [i]が== ' T ')0009 [I] = 4 。 56 } 57 のための(int型 I = 1 ; I <= M; iは++ ) 58 { 59 であれば(S2を[I] == ' A ')STR2 [I] = 1 。 60 他の 場合(S2 [i]が== ' C ')[I] = STR2 2 。 61 他 もし(S2 [i]が== ' G ')STR2 [I] = 3 ; 62 他の 場合(S2 [i]が== ' T ')[I] = STR2 4 。 63 } 64 のための(int型 i = 1 ; iが<= N; iが++)DP [I] [ 0 ] = DP [I- 1 ] [ 0 ] +形態[0009 [i]は] [ 5 ]。 65 のために(int型 I = 1 ; I <= M; I ++)は、DP [ 0 ] [I] = DP [ 0 ] [I- 1 ] +形態[ 5 ] [化2 [i]は]。 66 以下のために(int型 i = 1 ; iが<= N; I ++ ) 67 のための(INT J = 1 ; J <= Mであり、j ++ ) 68 { 69 DP [I] [J] = max_four(DP [I]、[J]、 DP [I- 1 ] [J- 1 ] +形態[0009 [I]【化2 [J]、DP [I- 1 ] [J] +形態[0009 [I]、[ 5 ]、DP [I ] [J- 1 ] +形態[ 5 ] [化2 [J])。 70 } 71 ライト(DP [n]は[M])。 72 リターン 0 ; 73 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)