題意:
給出一行字串,裡面有 () 四種括號,求出有多少個已經匹配好的括號。思路
區間dp:
我們把dp[i][j]表示從i到j裡面有多少已經配好的括號,那麼我們假如知道了 i 到 j 區間的最大匹配,那麼i+1到 j+1區間的就可以很簡單的得到。
那麼 假如第 i 個和第 j 個是一對匹配的括號那麼dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
那麼我們只需要從小到大列舉所有 i 和 j 中間的括號數目,然後滿足匹配就用上面式子dp,然後每次更新dp [ i ] [ j ]為最大值即可。
#include
#include
#include
using
namespace
std;
const
int maxn = 120;
string s;
int dp[maxn][maxn];
int main()
for(int k = i;k < j; k++) }}
printf("%d\n",dp[0][len-1]);
}return
0;}
poj2955(括號匹配DP)
題意 給乙個由 四種字元任意排列組成的字串,求最長合法的不連續字串的長度。思路 dp的時候有點倍增的意思,算出來以每個位置開始任意長度內的答案。倍增著算,注意計算一段的時候先判斷兩頭是否可以匹配,然後再列舉分界點來繼續鬆弛。關鍵給的字串不超過100,資料太弱了 n 3 的複雜度。include in...
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...