トピックポータル(ロス・バレー)タイトルポータル(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 }