괄호 쇠고기의 숫자 (DP)

링크 : 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

추천

출처www.cnblogs.com/letlifestop/p/10974541.html