题干
走你
题解
#include<cstdio>
#include<cstring>
#define max(x,y) (x) > (y) ? (x) : (y)
#define min(x,y) (x) < (y) ? (x) : (y)
bool equal(char s[],int i,int j){
return (s[i]== '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']');
}
int main(){
char s[110];
while(gets(s + 1)){
if(strcmp(s + 1,"end")==0)break;
int N = strlen(s + 1);
int dp[110][110];
memset(dp, 0, sizeof(dp));
for(int k=1;k<=N;k++){
for(int i=1;i+k<=N;i++){
int j = i+k;
if(equal(s,i,j)){
dp[i][j] = dp[i+1][j-1] + 1;
}else{
dp[i][j] = dp[i+1][j-1];
}
for(int t=i;t<=j;t++){
dp[i][j] = max(dp[i][j], dp[i][t] + dp[t+1][j]);
}
}
}
printf("%d\n",dp[1][N] * 2);
}
return 0;
}