思路
这个就是和回文很想的dp问题,只是多了一种情况需要考虑,就是 A B 都是合法括号,那么A+B也是合法括号,所以只要在dp的时候,吧区间分割,枚举一下分割的中点即可。
代码
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1010;
int dp[N][N];
char s[N];
bool is_match(char l, char r)
{
if (l == '(' && r == ')') return true;
if (l == '[' && r == ']') return true;
return false;
}
int main(){
while(cin >> s,s[0]!='e'){
memset(dp,0,sizeof dp);
int n=strlen(s);
for(int len=2;len<=n;len++){
for(int i=0;i+len-1<n;i++){
int j=i+len-1;
if(is_match(s[i],s[j]))dp[i][j]=dp[i+1][j-1]+2;
dp[i][j]=max(dp[i][j],max(dp[i+1][j],dp[i][j-1]));
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] << '\n';
}
}