题目大意:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度
解题思路:区间dp,用dp[i][j]表示[i,j]这个区间内有符合规则的最长子串的长度
如果str[i] 和str[j]能构成 ()或者[],那么dp[i][j] = dp[i + 1][j - 1] + 2
剩下的情况就是
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j])
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
char str[N];
int dp[N][N];
void solve() {
int len = strlen(str);
memset(dp, 0, sizeof(dp));
for (int i = 1; i < len; i++)
for (int j = 0; j + i < len; j++) {
int k = j + i;
if ( (str[j] == '(' && str[k] == ')') || (str[j] == '[' && str[k] == ']')) dp[j][k] = dp[j + 1][k - 1] + 2;
for (int l = j; l < k; l++)
dp[j][k] = max(dp[j][l] + dp[l + 1][k], dp[j][k]);
}
printf("%d\n", dp[0][len - 1]);
}
int main() {
while (scanf("%s", str)) {
if (strcmp(str, "end") == 0) break;
solve();
}
return 0;
}