题目链接:点击打开链接
题意:最大括号匹配,区间DP经典入门题目
dp[i][j]表示从i到j的最大匹配数,遍历i,j的合法组合,若s[i] == s[j],先令dp[i][j] = dp[i + 1][j - 1],再去枚举i,j之间的位置t,利用dp[i][j] = max(dp[i][j], dp[i][t] + dp[t + 1][j])更新dp[i][j]。
// POJ 2955 Brackets.cpp 运行/限制:47ms/1000ms
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
string s;
int dp[105][105];
while (cin >> s && s != "end") {
int len = s.size();
memset(dp, 0, sizeof(dp));
for (int i = len - 2; i >= 0; i--) {//始 由dp[i][j] = max(dp[i][j], dp[i][t] + dp[t + 1][j])得i要逆序
for (int j = i + 1; j < len; j++) {//终
if (s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']') {
dp[i][j] = dp[i + 1][j - 1] + 2;
}
for (int t = i; t < j; t++) {//t要取到i,适用于情况如 ][][
dp[i][j] = max(dp[i][j], dp[i][t] + dp[t + 1][j]);
}
}
}
cout << dp[0][len - 1] << endl;
}
return 0;
}