dp[i][j]代表i~j区间内匹配括号的个数,状态转移方程为:
if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')
dp[i][j]=dp[i+1][j-1]+2;
dp[i][j]=max{dp[i][k]+dp[k+1][j]};
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str;
int dp[105][105];
int main() {
while (cin >> str, str != "end") {
memset(dp, 0, sizeof(dp));
int len = str.length();
for (int k = 1; k < len; ++k) {
for (int i = 0, j = k; j < len; ++i, ++j) {
if ((str[i] == '('&&str[j] == ')') || (str[i] == '['&&str[j] == ']')) {
dp[i][j] = dp[i + 1][j - 1] + 2;
}
for (int x = i; x < j; ++x) {
dp[i][j] = max(dp[i][j], dp[i][x] + dp[x+1][j]);
}
}
}
cout << dp[0][len - 1] << endl;
}
return 0;
}