—
題目大意:給出乙個括號序列,求出其中匹配的括號數
((()))
6()()() 6
—(]) 4
—)[)( 0
([) 6—
第一步:確定狀態
—dp[i][j]表示a[i]……a[j]的串中,有多少個已經匹配的括號
—第二步:確定狀態轉移方程 —
如果a[i]
與a[k]
是匹配的 —
dp[i
][j]= max(dp[
i][j], dp[
i+ 1][k - 1] + dp[k + 1][j] + 2) —
(相當於是將i到
j分成[***xx
]***xx
兩部分) —
否則dp[
i][j] =max(dp[i][j],dp[
i+1][j]) —
(將第乙個元素去掉
——因為它肯定不能算) —
邊界dp[i][
i] = 0.
—如果用遞推的話,應該是區間大小由小到大遞增作為最外層迴圈
#include#include#includeusing namespace std;
int dp[105][105];
char a[105];
bool check(int i,int j)
int main()}}
}printf("%d\n",dp[1][len]);
gets(a+1);
}return 0;
}
POJ 2955 括號匹配,區間DP
題意 給你一些括號,問匹配規則成立的括號的個數。思路 這題lrj的黑書上有,不過他求的是新增最少的括號數,是的這些括號的匹配全部成立。我想了下,其實這兩個問題是一樣的,我們可以先求出括號要匹配的最少數量,那麼設原來括號的數量為l 新增了l 那麼其實原來括號匹配成功的括號數就是 l l 2 l 2。d...
poj2955 括號匹配,區間dp
題目大意 給乙個由,組成的字串,其中 可以匹配,求最大匹配數 題解 區間dp dp i j 表示區間 i,j 中的最大匹配數 初始狀態 dp i i 1 i,i 1可以匹配 2 0 狀態轉移見 include include include include include include using...
poj2955(括號匹配DP)
題意 給乙個由 四種字元任意排列組成的字串,求最長合法的不連續字串的長度。思路 dp的時候有點倍增的意思,算出來以每個位置開始任意長度內的答案。倍增著算,注意計算一段的時候先判斷兩頭是否可以匹配,然後再列舉分界點來繼續鬆弛。關鍵給的字串不超過100,資料太弱了 n 3 的複雜度。include in...