摘要:
本文簡要回顧了動態規劃的經典模型「括號匹配問題」,通過我初次解題時出現過的乙個誤區,對動態規劃演算法的設計思想做了深入闡釋。
給定乙個長度為n的括號序列(如「([)]」),求至少新增幾個括號,可使該括號序列匹配?
這個問題的正解如下:
定義狀態dp[i][j],表示第i~j的子括號序列達到匹配需要新增的最小括號數,1<=i<=j<=n(假定括號序列從1開始編號)。狀態轉移為
(邊界條件)若i == j,dp[i][j] = 1。否則
dp[i][j] = min,i<=k<=j-1
最終答案是dp[1][n]
不過我第一次做這題時,卻定義了這樣一種狀態轉移方式:
令儲存括號串的陣列為s。
(邊界條件)若i == j,dp[i][j] = 1
若s[i] == s[j],dp[i][j] = dp[i+1][j-1]
若s[i] != s[j],dp[i][j] = min+1
當時用這種方法在除錯的時候確實通過了一些資料,但是它是錯的。錯哪兒了?
首先給出一組能卡掉這種方法的資料:())(。答案應該是2,但是用錯誤方法得到的是4。
錯誤之處在於子問題劃分的方式不合理,從「())(」這組資料中就能發現,最左的()和最右的本來已經匹配上了,但是按照錯誤方法的狀態轉移,其中一對卻被切開重新匹配,於是答案平白無故多出2。括號匹配應是「區間dp」模型,狀態轉移時是要列舉劃分點的,第二種方法錯就錯在認為劃分點就是最左和最右,結果把原來匹配的括號串又給拆了。
區間DP 括號匹配問題
區間dp問題 區間dp主要是通過左邊界和右邊界來確定狀態轉移方程,在極大值或極小值問題中,通過區間短對區間長的推導或者區間長對區間短的推導,就可以找出區間長的極值化問題。這次學習的過程中主要是有字首和思想,就是用乙個一位陣列來存放從 0,i 這個區間的值的和,若要知道一段區間的值的和,只需要將 0,...
DP 括號匹配序列問題
簡單括號匹配問題是給出字串,判斷字串中的括號是否匹配,此類問題核心解決方案就是利用棧的後進先出的特性,從左到右依次遍歷字串,遇左括號進棧,遇右括號將其與棧頂元素配對,若能配對,則棧頂元素出棧,繼續遍歷,若不能配對,則返回false。字串遍歷結束後,判斷棧是否為空,若不為空返回false,若為空,返回...
poj2955(括號匹配DP)
題意 給乙個由 四種字元任意排列組成的字串,求最長合法的不連續字串的長度。思路 dp的時候有點倍增的意思,算出來以每個位置開始任意長度內的答案。倍增著算,注意計算一段的時候先判斷兩頭是否可以匹配,然後再列舉分界點來繼續鬆弛。關鍵給的字串不超過100,資料太弱了 n 3 的複雜度。include in...