#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string>
using namespace std;
const int size = 100;
string s;
int testcase;
int n;
int dp[size][size];
const int INF = 0x3f3f3f3f;
bool match(int i,int j){
if(s[i]=='['&&s[j]==']'||s[i]=='('&&s[j]==')')
return true;
return false;
}
int MIN(int x,int y){
return x>y?y:x;
}
// two cases:
// 1. dp[i][j] = dp[i+1][j-1] if(match(s[i], s[j]))
// 2. dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]) where k = 1,2,...,k-2
// by the way, every step, 2) must execute, 1) optional
int main(){
scanf("%d", &testcase);
while (testcase--){
cin>>s;
n = s.size();
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; ++i) {
dp[i][i] = 1;
}
// pay attention that 'len' starts from 2;
for (int len = 2; len <= n; ++len) {
for (int i = 0; i <= n-len; ++i) {
int j = i+len-1;
dp[i][j] = INF;
if (match(i,j))
dp[i][j] = MIN(dp[i][j], dp[i+1][j-1]);
for (int k = i; k <=j-1 ; ++k) {
dp[i][j] = MIN(dp[i][j], dp[i][k]+dp[k+1][j]);
}
}
}
cout<<dp[0][n-1]<<endl;
}
}
nyoj 括号匹配(二)
最新推荐文章于 2019-03-11 21:15:03 发布