POJ 2955 Brackets 記憶化搜尋

2021-06-23 01:04:50 字數 668 閱讀 9804

題目型別dp

題目意思

給出乙個最長 100 的括號序列 問最長配對的括號子串行的長度是多少

括號的合法匹配有 () 和 兩種

例如 ((())) 最長是 6  而 [((]) 最長是 2

解題方法

記憶化搜尋

#include #include #include using namespace std;

char str[110];

int dp[110][110];

int dfs(int l, int r)

if(dp[l][r] != -1) return dp[l][r]; // 如果這段序列之前已經搜尋過直接返回

for( int i=l; i<=r; i++ )

if(str[r] != ')' && str[r] != ']') dp[l][r] = max(dp[l][r], dfs(l, r-1));

else

} if(dp[l][r] == -1) dp[l][r] = 0;

return dp[l][r];

}int main()

return 0;

}

poj2955解題報告

解題思路 找出最少需要多少個括號來匹配,然後再拿總長度減去最少需要匹配的括號數 轉移方式有兩種 第一種 形如s形如 s1 或者 s1 則d s min d s d s1 第二種 s至少有兩個字元的時候可以分成ab兩個子串,則d s d a d b 但需要注意的是,不管是否滿足第一條,都要嘗試第二條,...

poj2955(括號匹配DP)

題意 給乙個由 四種字元任意排列組成的字串,求最長合法的不連續字串的長度。思路 dp的時候有點倍增的意思,算出來以每個位置開始任意長度內的答案。倍增著算,注意計算一段的時候先判斷兩頭是否可以匹配,然後再列舉分界點來繼續鬆弛。關鍵給的字串不超過100,資料太弱了 n 3 的複雜度。include in...

POJ 2955 (dp括號匹配)

題意 給出一行字串,裡面有 四種括號,求出有多少個已經匹配好的括號。思路 區間dp 我們把dp i j 表示從i到j裡面有多少已經配好的括號,那麼我們假如知道了 i 到 j 區間的最大匹配,那麼i 1到 j 1區間的就可以很簡單的得到。那麼 假如第 i 個和第 j 個是一對匹配的括號那麼dp i j...