UVA1626ブラケット配列は、配列(間隔DP)をブラケット

トピックポータル(ロス・バレー)タイトルポータル(UVA)  


問題解決のためのアイデア

dpの範囲は、ことは明らかであるもちろん、思い出ACを検索することができますが、ここでは、範囲DPについて述べました。

間隔DPの重要な特徴は、中間ノードkを列挙することが必要です

[i] [j]は括弧を追加する正当な必要性の数列の... jの形成を表し、Fで、この質問を見て、

S [i]は== S [j]は、[I] [j]は、次いでF [I + 1] [J-1]、及び中間点kを列挙し= Fとき明らかに、動的伝達方程式を書くことができます:F [I] [J] = MAX(F [I] [J]、F [i]が[K] + F [K + 1] [J])

需要Fを確保するために、[I] [J]場合[I + 1] [J-1]、[I] [K]、F [K + 1] [J]が完了した要求F、第一層F I後方に列挙する必要があり、Jである第2の層は、(QAQを理解する手プッシュ)を列挙しなければなりません

OKに言い渡さ場合F列を取得した後、我々は出力(S)のフォームまたは[S]であるので、どのように出力に検討し、そう明らかに再帰的な出力に加え、いくつかの特別な必要があります。

しかし、私は、コードを書き終えた後に、この質問はWAされている、30分後に問題を発見しました。

バック一緒にgetchar関数とT >>問題への解決策を読んだ後、最終的にそれはCINれるべき見つかっ();;トンを読んだとき、私はCIN >>トンを使用して開始したのはなぜ?

最後に時間近く、問題の根本に私を悩まました -

スパイシーなチキン羅区間違っている質問!データの最初のセット内のサンプル及びスペースの列の間のT。(原題は見ての重要性を反映しています)

ACコード

1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include <cmath>
 4の#include <cstdioを>
 5の#include <CStringの>
 6の#include <cstdlib>
 7の#include <キュー>
 8の#include < 設定 >
 9# <地図>含む
 10の#include <ベクトル>
 11の#include <iomanip>
 12の#include <ctimeの>
 13の#include <積層>
 14  使用 名前空間STDを、
15  文字列sの。
16  int型トン、LEN、];
17  ボイドプリント(int型 L、INT R){
 18      場合(L> R)のリターン;
19      であれば(L == R){
 20          であれば(sは[L] == ' ' || S [L] == ' ')のprintf(" ()" )。 
21          であれば(S [L] == ' [ ' || S [L] == ' ] ')のprintf(" [] " )。
22          リターン;
23      }
 24     もし((F [L] [R] == F [L + 1 ] [R- 1 ])&&((S [L] == ' ' && sの[R] == ' ')||(のS [ L] == ' [ ' && S [R] == ' ] ' ))){
 25          のprintf(" %のC " 、S [L])。
26          プリント(L + 1、R- 1 )。
27          のprintf(" %のC " 、S [R])。
28          リターン;
29      }
 30      のためにINT K = L。){
 31は、         IF(F [L] [R&LT] == F [L] [K] + F [K用+ 1 ] [R&LT]){
 32              プリント(L、K)、
 33は              プリント(Kの+ 。1 、R&LT);
 34れます             戻り; //出力に正の解を見つけて返すために
 35          }
 36      }
 37  }
 38が INT )(主
 39  {
 40      scanfの(" %のD "、&T)、
 41は     GETCHAR();
 42は     、一方(T-- ){
 43であります          memsetの(F、は0x3Fはsizeof (F));
 44れます         getline(CIN、S)。
45          のgetline(CIN、S)。
46          LEN = s.length()。
47          であれば(LEN == 0 ){
 48              のprintf(" \ nをする\ n " );
49              続け;
50          }
 51          Fは[ 0 ] [ 0 ] = 0 52          のためには、int型 = Iを1 ; iがLEN <; iは++)F [i]は[I] = 1、F [i]は[I- 1 ] = 0 ;
53          のためのint型 I = len-1 ; I> = 0 ; i-- ){
 54              のためのint型 J = I + 1、J <LEN; J ++ ){
 55                  であれば((S [I] == ' ' && S [J] == ' ')||(S [I] == ' [ ' && S [j] == ' ] '))F [i]は[J] =分([I] [J] F、F [I + 1 ] [J- 1 ])。
56                  のためのint型、K <J、K = I kは++)F [I]は[j]は分=(F [I] [J]、[I] [K] + F [K + F 1 ] [J])。
57              }
 58          }
 59         プリント(0、len- 1 )。
60          のprintf(" の\ n " );
61          であれば(T)のprintf(" の\ n " );
62      }
 63      リターン 0 64 }

 

おすすめ

転載: www.cnblogs.com/yinyuqin/p/11605128.html