UVA 1626括號序列DP

2021-10-06 14:43:39 字數 1544 閱讀 9301

題目背景:

我們將正規括號序列定義如下:

空序列是正規括號序列。

如果s是乙個正規括號序列,那麼(s)和[s]都是正規括號序列。

如果a和b都是正規括號序列,那麼ab是乙個正規括號序列。

例如,下面這些序列都是正規括號序列:

而下面這些不是正規括號序列:

題目描述:

給你一些含有字元』(』,』)』,』[『和』]'的括號序列。你需要找乙個最短的正規括號序列,使給定括號序列作為乙個子串行包含在其中。

輸入描述:

輸入第一行為乙個正整數,代表資料組數。每組資料內容見下文。這一行之後跟著乙個空行,每兩組資料中間也有乙個空行。

每組輸入都為一行,最多包含100個括號(字元』(』,』)』,』[『和』]』),每兩個括號之間沒有空格。

輸出描述:

對於每一組資料,格式必須符合如下:

輸出最短的括號序列,滿足題目描述,並且每兩個輸出之間必須有乙個空行分開(最後一行沒有)。

輸入樣例:

1([(]

輸出樣例:

()[()]

1.首先注意讀入方式getchar() 吃掉空格;由於輸入的串可能是空串,則需要用getline的字串讀入方式。getline不會讀入行尾換行符。

2.遞迴列印

3.狀態來自兩種轉移方式:(1)相同

(2)兩個子字串

詳情參加演算法競賽入門(第二版)p278

#include

#include

#include

#include

#define inf 2147483640;

using

namespace std;

string op;

char a;

int dp[

505]

[505];

intmatch

(char x,

char y)

void

print

(int i,

int j)if(

match

(op[i]

,op[j]

)&& dp[i]

[j]== dp[i+1]

[j-1])

if(op[i]

=='['

)return;}

for(

int k = i;k}int

main()

}for

(int i=

0;i)for

(int i=n-

2;i>=

0;i--

)for

(int k=i;k<=j-

1;k++)}

}//printf("%d ",dp[0][n-1]);

print(0

,n-1);

if(t)

printf

("\n");

printf

("\n");

}return0;

}//([()

//(((())

區間DP(括號序列,uva1626)

發現動態規劃,記憶化搜尋,bfs之類的尋找最優解的演算法,往往會有一些尋找最優解過程中的記錄。通過觀察這些記錄,我們能尋到一些蛛絲馬跡,從而找到最優解是如何一步一步形成的。因此可以列印決策過程,或者說可以還原我們是如何一步一步找到答案的,比如列印最短路徑,又或者如此題中列印解。以前bfs還能列印路徑...

uva1626 括號序列(區間DP)

題意 給出t個字串,僅由 四種 字元組成,其中 為合法,均為合法,而 則為不合法狀態。求最少新增多少個字元,使得字串合法,輸出合法的其中一種方案。原始字串字元不多於100個 第一行為字串數量。樣例輸入 1 樣例輸出 思路 1.前後配對的為dp i j min dp i j dp i 1 j 1 2....

uva 1626 括號序列

這道題目是劉汝佳演算法入門中的一道動態規劃題目。要求新增最少括號得到乙個規則序列。先來看看它的狀態轉移,稍有複雜。邊界條件就是s為空是d s 為0,s位單字元時d s 1。另外需要注意的就是不管s是否進行第一種轉移,都要嘗試第二種轉移。include include include include ...