リンク:https://ac.nowcoder.com/acm/problem/21652
出典:牛オフネットワーク
タイトル説明
牡牛座は、最近開いた括弧のマッチングを引く学び始めました
あなたの2つのブラケットシーケンスを与える、正当を保証するものではありません、2つのブラケット正当な括弧配列の配列に結合することができますどのように多くの異なる方法頼みます
合併時には、元の順序の順序を変更することはできません
説明を入力します。
二つの文字列S1、S2の2行を含み、
1≤|。S1 |、| S2 |≤2500
出力説明:
出力整数、MOD 1E9 + 7
具体的なアイデア:
DP [i] [j]は、最初の文字列の前に第二の実施形態をマルチ前提の前に「(」比「」)で数回目のi番目とjを示し、このプロセスが使用される追加の開口アレイを必要としますこの記録プロセス。
そして、メモリのバーストは、回転式配列のように戦います。
MLEコード:
1件 の#pragmaコメント(リンカー、 "/ STACK:102400000,102400000") 2の#include <ビット/ STDC ++ H> 3 使用して 名前空間STDを、 4位LL定義長い 長い 5位INF定義0x3f3f3f3f 6位ll_infを定義する(<< 1LL 60 ) 7位LSON Lを、中間、RTを定義<< 1 8#定義rsonミッド+ 1、R、RT << 1 | 1つの 9 のconst int型 MAXN = 2500 + 10 。 10 のconst int型 N = 15; 11 のconst int型 MOD = 1E9 + 7 。 12 LL DP [MAXN] [MAXN]。 13 int型のプレ[MAXN] [MAXN]。 14 チャー0009 [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 iが++ ) 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] <PRE 0を掻き出す前にi番目とj番目の2番目の文字列の前に最初の文字列が、違法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コード:
1件 の#pragmaコメント(リンカー、 "/ STACK:102400000,102400000") 2の#include <ビット/ STDC ++ H> 3 使用して 名前空間STDを、 4位LL定義長い 長い 5位INF定義0x3f3f3f3f 6位ll_infを定義する(<< 1LL 60 ) 7位LSON Lを、中間、RTを定義<< 1 8#定義rsonミッド+ 1、R、RT << 1 | 1つの 9 のconst int型 MAXN = 2500 + 10 。 10 のconst int型 N = 15; 11 のconst int型 MOD = 1E9 + 7 。 12 int型 DP [ 3 ] [MAXN]。 13 int型のプレ[ 3 ] [MAXN]。 14 チャー0009 [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 DP [CUR] [ 0 ] = 1 。 23 のためには、(int型 i = 0 ; I <= LEN1; iは++ ) 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 場合 <(PRE [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]の%= MOD。 46 } 47 } 48 のprintf(" %Dを\ n "、プリ[CUR] [LEN2] == 0 DP [CUR] [LEN2]:0 )。 49 リターン 0 ; 50 }
学習ウェブサイト:https://blog.csdn.net/j2_o2/article/details/87971817#commentBox