括弧の牛肉内の番号(DP)

リンク: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

おすすめ

転載: www.cnblogs.com/letlifestop/p/10974541.html