문제 유사한 유전자 루오 구 P1140에 대한 솔루션

매일 질문 day23 펀치

분석

DP는 [I] [J]를 제 J 일치 i 번째 전과 서열 A 및 B 서열에서 최대 유사도를 나타낸다

그래서, DP 방정식은 생각하기 쉽다 :

1.이 [I] 및 B [J]와 일치하자

2. [I]를하자 공석 서열 B와 일치

3.하자있는 B [j를 상기 서열 A의 간극 일치

DP [I] [J] = 최대 (DP [I] [J], (DP) [I-1] [J-1] + 형태 [A [I] [B [J], (DP) [I-1] [J] 형상 [A [내가] [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  사용  스페이스 성병;
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      반환 최대 (최대 (X, Y), 최대 (Z, O));
40  }
 41  서명) (주
 42  {
 43      , N = 판독 ();
(44)      에 대한이 ( int로 I = 1 CIN >> 내가 ++; i가 N = <) S1 [I]을;
45      M = ) (판독;
46       ( int로 I =1 ; I <= m; 내가 ++) 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 = <; 내가 ++ )
 51      {
 52          의 경우 (S1 [I] == ' ' )를 STR1 [I] = 1 ;
(53) 그 밖의 경우 (S1 [I] == ' C ' ) STR1 [I] = 2 ;
          (54)          그 밖의  경우 (S1 [I] == ' G ' ) STR1 [I] = 3 ;
(55)          그 밖의  경우 (S1 [I] == ' T ' ) STR1 [I] = 4 ;
56      }
 57       ( int로 I = 1 ; I <= m; 내가 ++ )
 58      {
 59          의 경우 (S2로 [I] == ' ' ) STR2 [I] = 1 ;
(60) 그 밖의 경우 (S2 [I] == ' C ' ) STR2 [I] = 2 ;
(61) 다른                    경우 (S2 [I] == ' G ' ) STR2 [I] = 3 ;
(62)          그 밖의  경우 (S2 [I] == ' T ' ) STR2 [I] = 4 ;
63      }
 64       ( int로 I = 1 [I] [DP를 내가 ++; i가 N = <) 0 ] DP가 = [I- 1 ] [ 0 ] + 형태 [STR1 [I] [ 5 ];
(65)      에 대한이 ( int로 난 = 1 ; I <= m; 내가 ++) DP [ 0 ] [i]는이을 DP = [ 0 ] [Ⅰ- 1 ] + 형태 [ 5 ] [STR2 [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 [Ⅰ- 1 ] [J - 1 ] + 형태 [STR1 [내가] [STR2 [J], (DP) [I- 1 ] [J] + 형태 [STR1 [내가] [ 5 ], DP [I [J - 1 ] + 형태 [ 5 ] [STR2 [J]);
70          }
 71      기입 (DP [N] [m]);
72      반환  0 ;
73 }

갱스터의 논문을주세요(어쨌든, 나는이 논문을 무엇을 의미하는지 모른다)

추천

출처www.cnblogs.com/handsome-zyc/p/11614323.html