uva1626 括號序列(區間DP)

2021-08-15 12:03:42 字數 1267 閱讀 8408

題意:

給出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 ...