タイトル説明
括弧はあなたに有効なシーケンスS1を与え、あなたは「()」を除去することができますたびに
、あなたがゼロ以上を削除することができます「()」
シーケンスを求めるには、別のブラケットS2に削除することができます
、あなたがゼロ以上を削除することができます「()」
シーケンスを求めるには、別のブラケットS2に削除することができます
説明を入力します。
(≤| | S 2≤入力文字列sの最初の行 100)
(≤2≤| | T文字列tの第二の入力ライン 100)
出力説明:
もしあなたを出力することができ、「可能性」
それ以外の場合は、出力「インポッシブル」
例1
エントリー
(()) ()
輸出
可能
例2
エントリー
() ()
輸出
可能
例3
エントリー
(()()()) ((()))
輸出
不可能
例4
エントリー
((())((())())()) (()(())())
輸出
可能
例5
エントリー
((())((())())()) ((()()()()()))
輸出
インポッシブル
アイデア:入力文字列が、ターゲット文字列bです。ブラケットは常に左ブラケットと右ブラケットの数よりも、または等しいが(最後に等しくなるように)ことを保証しなければならないときに削除
我々はDPを定義することができる[I] [J] [ k]は、一致する文字列Bの前に、iの文字列の前に検討を表しますjは、文字列が左ブラケット部から削除される-右括弧=実現可能性のk個、分類は議論を転送することができ、
最終的な答えがdp [n]は[M]が[ 0]
コード:
1の#include <cstdioを> 2の#include <fstreamの> 3の#include <アルゴリズム> 4の#include <cmath> 5の#include <両端キュー> 6の#include <ベクトル> 7の#include <キュー> 8の#include < ストリング > 9#含む<CStringの> 10の#include <地図> 11の#include <スタック> 12の#include < セット > 13の#include <sstream提供さ> 14の#include <入出力ストリーム> 15件 の#define MOD十億七 16 の#defineのEPS 1E-6 17 #defineは長い長いちゃう 18 の#define 0x3f3f3f3f INF 19 使って 名前空間STDを、 20 21 CHAR [ 110 ]、B [ 110 ]。 22 BOOL DP [ 110 ] [ 110 ] [ 110 ]。 23 のint main()の 24 { 25 のscanf(" %sの%sの"、(A + 1)、(B + 1 ))。 26 INT M = STRLEN(A + 1)、N = STRLEN(B + 1 )。 27 DP [ 0 ] [ 0 ] [ 0 ] = 1 。 28 のためには、(int型 i = 0 ; iがm <; iは++ ) 29 { 30 のための(int型 J = 0 ; J <= N; J ++ ) 31 { 32 のための(int型のk = 0 ; K <= M; ++ kは) 33 { 34 であれば(DP [I] [J] [K]) 35 { 36 であれば(!K && [I + 1 ] == B [J + 1 ]) 37 { 38 DP [I + 1 ] [j + 1 ] [K] = 1 。 39 } 40 であれば([I + 1 ] == ' (' ) 41 { 42 DP [I + 1 ] [j]を[K + 1 ] = 1 ; 43 } 44 他の 場合(K) 45 { 46 DP [I + 1 ] [J] [K- 1] = 1 。 47 } 48 } 49 } 50 } 51 } 52 であれば(DP [M] [N] [ 0 ]) 53 { 54 のprintf(" 可能\ nを" )。 55 } 56 他の 57 { 58 のprintf(" 不可の\ n " ); 59 } 60 }