題意:
給出t個字串,僅由 『(』 『)』 『[』 『]』 四種 字元組成,其中 』()『 『』為合法,』()』 『()』 『[()]』 均為合法,而』[(])『 『[)』 則為不合法狀態。求最少新增多少個字元,使得字串合法,輸出合法的其中一種方案。(原始字串字元不多於100個)
第一行為字串數量。
樣例輸入:
1 ([(]
樣例輸出:
()[()]
思路:
1.前後配對的為dp[i][j]=min(dp[i][j],dp[i+1][j-1])
2.字串至少兩個以上時,進行二分,k=i:j-1,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])
無論字串滿不滿足第一條,都要進行第二條運算,反例:s=」」,如果只進行第一步得到的是』][『最後還需要再加兩個括號,這是不符合題目最小的要求的。
**:
#include
#include
#include
#include
#include
using
namespace
std;
const
int max = 100;
const
int inf = 0x3f3f3f3f;
int n;
char s[max + 5];
int dp[max + 5][max + 5];
bool match(int a, int b)
void print(int l, int r)
if(match(l, r) && dp[l][r] == dp[l + 1][r - 1])
for(int k = l; k < r; ++ k) if(dp[l][r] == dp[l][k] + dp[k + 1][r])
} int main()
for(int i = 0; i < n; ++ i)
dp[i][i] = 1;
for(int i = n - 1; i >= 0; -- i)
} if(*** ++) putchar(10);
print(0, n - 1);
putchar(10);
} return
0;
}
還有需要注意的地方就是,輸入串可能為空,所以不能用scanf之類的輸入。 區間DP(括號序列,uva1626)
發現動態規劃,記憶化搜尋,bfs之類的尋找最優解的演算法,往往會有一些尋找最優解過程中的記錄。通過觀察這些記錄,我們能尋到一些蛛絲馬跡,從而找到最優解是如何一步一步形成的。因此可以列印決策過程,或者說可以還原我們是如何一步一步找到答案的,比如列印最短路徑,又或者如此題中列印解。以前bfs還能列印路徑...
UVA 1626括號序列DP
題目背景 我們將正規括號序列定義如下 空序列是正規括號序列。如果s是乙個正規括號序列,那麼 s 和 s 都是正規括號序列。如果a和b都是正規括號序列,那麼ab是乙個正規括號序列。例如,下面這些序列都是正規括號序列 而下面這些不是正規括號序列 題目描述 給你一些含有字元 和 的括號序列。你需要找乙個最...
uva 1626 括號序列
這道題目是劉汝佳演算法入門中的一道動態規劃題目。要求新增最少括號得到乙個規則序列。先來看看它的狀態轉移,稍有複雜。邊界條件就是s為空是d s 為0,s位單字元時d s 1。另外需要注意的就是不管s是否進行第一種轉移,都要嘗試第二種轉移。include include include include ...