問題と同様の遺伝子羅区P1140へのソリューション

デイリー質問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      { 0000000 }、
 31      { 05、 - 1、 - 2、 - 1、 - 3 }、
 32      { 0、 - 15、 - 3 - 、 - 2 - 4 }、
 33      { 0、 - 2、 - 35、 - 2 - 2 }、
 34      { 0、 - 1、 - 2 - 25、 - 1 }、
 35      { 0、 - 3 - 、 - 4 - 、 -2、 - 10 }
 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 }

論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)

おすすめ

転載: www.cnblogs.com/handsome-zyc/p/11614323.html