링크 : https://ac.nowcoder.com/acm/problem/21652
출처 : 가축 오프 네트워크
제목 설명
황소 자리는 최근에 여는 괄호 매칭을 끌어 배우기 시작
이 브라켓 합법적 인 괄호 시퀀스의 순서로 결합 할 수있는 방법에는 여러 가지 질문, 합법적을 보장하지 않습니다, 당신이 괄호 순서를 부여
합병의 시간은 원래 주문 순서를 변경할 수 없습니다
설명을 입력합니다 :
두 문자열 S1, S2의 두 라인을 포함하는
1 ≤ |. S1 |, | S2 | ≤ 2,500
출력 설명 :
출력 정수, 개조 1E9 + 7
특정 아이디어 :
DP [I] [J]를 제 1 문자열 전에 제 2 실시 형태를 멀티 전제 전에 '('비 '')의 수가 제 i 번째와 J를 나타내고,이 프로세스는 사용되는 부가적인 개구 어레이를 필요 이 기록 방법.
그리고 메모리의 버스트는, 롤링처럼 배열 싸운다.
MLE 코드 :
하나 의 #pragma 주석 (링커 "/ STACK : 102400000,102400000") 2 #INCLUDE <. 비트 / stdc ++ H> 3 사용 스페이스 성병; 4 #는 LL 정의 긴 길이 5 #가 INF 정의 0x3f3f3f3f 6 #가 ll_inf 정의 (<< 1ll 60 ) 7 #가 LSON 리터 미드, RT 정의 << 1 8 # 정의 rson 미드 + 1 , R, RT << 1 | 1 9 CONST의 INT의 maxn = 2500 + 10 ; 10 CONST의 INT의 N = 15; 11 CONST INT 개조 된 1E9 + = 7 ; 12 LL의 DP [maxn] maxn]; 13 INT의 전 [maxn] maxn]; 14 문자 STR1 [maxn, STR2 [maxn]; 15 INT 의 main () 16 { 17 는 scanf ( " %의 S " , STR1 + 1 ); 18 는 scanf ( " %의 S " , STR2 + 1 ); 19 INT LEN1 = 나 strlen (STR1 + 1 ); 20 INT LEN2 = 나 strlen (STR2 + 1 ); 21 DP [0 ] [ 0 ] = 1 ; (22) 에 대한이 ( int로 I = 0 ; I <= LEN1; 내가 ++ ) 23 { 24 대 ( INT의 J = 0 ; J <= LEN2, J ++ ) 25 { 26 일 경우 (전 J &&!에서) 계속 ; 27 일 경우 (j 라!) [I] [J] 미리 = I- 미리 1 ] [J] + (STR1 [I] ==은 ' ( ' ? 1 - 1 ) (28)는 다른 미리 [I] [J] 미리 = [I]는 [J - 1 ] + (STR2 [J] == '( ' ? 1. : - . 1 ), 29 IF (프리 [I] [j]가 < 0 ) // i 번째와 j 번째의 제 문자열 전에 제 1 문자열 전에 긁어 경우 것은, 불법 0보다 작은 경우 (30) 계속해서 , 31는 IF (I) (32) DP [I] [J] + DP = [I- 1이다. ] [J], (33)는 IF (J)가 (34)는 DP [I] [J] + DP = [I] [J- . 1 ]] (35) DP [I] [J] % = MOD; 36 } 37 } 38 인 의 printf ( " % LLD의 \의 N- ' , 미리 [LEN1] LEN2] == 0 DP [LEN1] LEN2]?0 ); 39 반환 0 ; 40 }
AC 코드 :
하나 의 #pragma 주석 (링커 "/ STACK : 102400000,102400000") 2 #INCLUDE <. 비트 / stdc ++ H> 3 사용 스페이스 성병; 4 #는 LL 정의 긴 길이 5 #가 INF 정의 0x3f3f3f3f 6 #가 ll_inf 정의 (<< 1ll 60 ) 7 #가 LSON 리터 미드, RT 정의 << 1 8 # 정의 rson 미드 + 1 , R, RT << 1 | 1 9 CONST의 INT의 maxn = 2500 + 10 ; 10 CONST의 INT의 N = 15; 11 CONST INT 개조 된 1E9 + = 7 ; 12 의 INT (DP)에 [ 3 ] [maxn]; 13 INT의 전 [ 3 ] [maxn]; 14 문자 STR1 [maxn, STR2 [maxn]; 15 INT 의 main () 16 { 17 는 scanf ( " %의 S " , STR1 + 1 ); 18 는 scanf ( " %의 S " , STR2 + 1 ); 19 INT LEN1 = 나 strlen (STR1 + 1 ); 20 INT LEN2 = 나 strlen (STR2 +1 ); 21 의 INT CUR = 0 ; 22 [CUR] DP 0 ] = 1 ; (23) 에 대한이 ( int로 I = 0 ; I <= LEN1; 내가 ++ ) 24 { 25 일 경우 (I) 26 { 27 CUR ^ = 1 ; 28 memset 함수 (DP [CUR, 0 , 는 sizeof (DP [CUR])); 29 } 30 // 미리 [I] [0] = 31 대를 ( INT J = 0; J <= LEN2; J ++ ) 32 { 33 의 경우 (I &&! J) (34) 를 계속 ; 35 의 경우 (!의 J) (36) 이전 [CUR] [J] = 프리 [CUR ^ 1 ] [J] + (STR1 [I] == ' ( ' ? 1 - 1 ) 37 다른 38 미리 [CUR] J]를 미리 [CUR를 =] [J - 1 ] + (STR2 [J] == ' ( ' ? 1 - 1 )] (39)가 있는 경우 (프리 [CUR] [J] < 0 ) (40)가 계속; 41 의 경우 (I) (42) DP [CUR] [J] + = DP [CUR ^ 1 ] [J]; (43) 만약 (j) (44) DP [CUR] [J] + = DP [CUR] [J = 1 ]; 45 DP [CUR] [J] = % 개조; 46 } 47 } 48 의 printf ( " % D \ 없음 " 사전 [CUR] LEN2] == 0 DP [CUR] LEN2] : 0 ); 49 반환 0 ; 50 }
학습 웹 사이트 : https://blog.csdn.net/j2_o2/article/details/87971817#commentBox