if(a[s] == '[' || a[s] == '(')dp[s][e] = min(dp[s][e] , dp[s + 1][e] + 1) ;
if(a[e] == ']' || a[e] == ')')dp[s][e] = min(dp[s][e] , dp[s][e - 1] + 1) ;
for (int k = s ; k < e ; k ++ ){
dp[s][e] = min(dp[s][e] , dp[s][k] + dp[k + 1][e]) ;
}
}
}
cout 《 ((l + dp[0][l - 1]) / 2 - dp[0][l - 1]) * 2 《 endl;
}
return 0 ;
}
当然,按照思路来写应该是这样的区间dp.
#define N 105
int dp[N][N] ;
char a[N] ;
bool check(int i ,int j){
if(a[i] == '[' && a[j] == ']')return 1 ;
if(a[i] == '(' && a[j] == ')')return 1 ;
return 0 ;
}
int main() {
int T ;
while(cin 》 a){
if(strcmp(a ,"end") == 0)break ;
int l = strlen(a) ;
mem(dp , 0) ;
for (int i = 2 ; i <= l ; i ++ ){
for (int j = 0 ; j + i - 1 < l ; j ++ ){
int s = j ;
int e = j + i - 1 ;
if(check(s ,e ))dp[s][e] = max(dp[s][e] , dp[s + 1][e - 1] + 2) ;
for (int k = s ; k < e ; k ++ ){
dp[s][e] = max(dp[s][e] , dp[s][k] + dp[k + 1][e]) ;
}
}
}
cout 《 dp[0][l - 1] 《 endl;
}
return 0 ;
}