區間DP 括號匹配問題

2021-10-23 21:00:51 字數 1376 閱讀 7552

區間dp問題

區間dp主要是通過左邊界和右邊界來確定狀態轉移方程,在極大值或極小值問題中,通過區間短對區間長的推導或者區間長對區間短的推導,就可以找出區間長的極值化問題。

這次學習的過程中主要是有字首和思想,就是用乙個一位陣列來存放從[0,i]這個區間的值的和,若要知道一段區間的值的和,只需要將[0,i]的字首和減去[0,j]的字首和即可。

區間dp的一般框架為

for len 1 to maxsize

for i 0 to maxsize-len

j=len+i……

(狀態轉移方程 判斷條件)

…for k i to j // 將區間[i,k]和區間[k+1,j]合併

dp[i][j] =min

ans = dp[開始位置][結束為止]

例題:括號序列由()、{}、構成,例如「(([{}]))()」是合法的,而「(}(}」「(」都是不合法的。如果乙個序列不合法,編寫乙個程式求新增最少括號數,使得這個序列合法。如:「(}(}」最少需要新增4個括號變成合法的,即「(){}(){}」。

狀態轉移方程:

dp[i][j]=min(dp[i][j],dp[i+1][j]+1) //左邊界減小

dp[i][j]=min(dp[i][j],dp[i][j-1]+1) //右邊界增大

dp[i][i]=1 // 乙個無法匹配

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int dp[

10001][

10001];

string s;

intmain()

')||(s[i]

=='('

&&s[j]

==')'))

dp[i]

[j]=

min(dp[i]

[j], dp[i +1]

[j -1]

);elseif(

(s[i]

=='['

)|| s[i]

=='')||

(s[j]

==')'))

dp[i]

[j]=

min(dp[i]

[j], dp[i]

[j -1]

);for(

int k = i; k < j; k++)}

} cout << dp[0]

[s.size()

-1];

return0;

}

括號匹配(二)NYOJ 區間dp)

括號匹配 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入 第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一...

poj1141(括號匹配 區間dp)

題意 給乙個括號序列,問包含此序列的最短合法括號序列 解法 普通的區間dp,num i j 記錄的是i j子串行最少需要補充的括號個數,只是在要記錄區間的最優分界點rem i j 從而將最短合法括號序列輸出,複雜度o n 3 include include include using namespa...

POJ 2955 括號匹配,區間DP

題意 給你一些括號,問匹配規則成立的括號的個數。思路 這題lrj的黑書上有,不過他求的是新增最少的括號數,是的這些括號的匹配全部成立。我想了下,其實這兩個問題是一樣的,我們可以先求出括號要匹配的最少數量,那麼設原來括號的數量為l 新增了l 那麼其實原來括號匹配成功的括號數就是 l l 2 l 2。d...