區間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...