題目背景:
我們將正規括號序列定義如下:
空序列是正規括號序列。
如果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 ...