매일 질문 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 }
갱스터의 논문을주세요(어쨌든, 나는이 논문을 무엇을 의미하는지 모른다)