最大括号匹配数。如果找到一对匹配的括号[xxx]oooo,就把区间分成两部分,一部分是xxx,一部分是ooo,然后以此递归直到区间长度为1或者为2.
状态转移方程:dp[i][j] = min(dp[i+1][j],dp[i+1][k-1]+dp[k+1][j]+1)(i<=k<=j&&i和k是一对括号)
/***********************************************
* Author: fisty
* Created Time: 2015/6/4 10:33:35
* File Name : poj2955.cpp
*********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 110
int dp[MAX_N][MAX_N];
int main() {
//freopen("in.cpp", "r", stdin);
cin.tie(0);
ios::sync_with_stdio(false);
string s;
while(cin >> s){
int n = s.length();
if(!s.compare("end")) break;
Memset(dp, 0);
// for(int i = 0;i < n-1; i++){
// if((s[i] == '(' && s[i+1] == ')') || (s[i] == '[' && s[i+1] == ']')){
// dp[i][i+1] = 2;
// }
// }
//
for(int i = n-2; i >= 0; i--){
for(int j = i+1;j < n; j++){
if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')){
dp[i][j] = dp[i+1][j-1] + 2;
}
for(int k = i;k <= j; k++){
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j]);
}
}
}
cout << dp[0][n-1] << endl;
}
return 0;
}