之前做过这道题,不过做完了还是不怎么明白,今天换了种方法重新做了一遍,基本已经理解了,好吧,懒得多说,就这样。。。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int s[105][105],num;
string a,add;
int f(int i,int j)
{
if(s[i][j]>=0) return s[i][j];
if(i>j) return 0;
if(i==j) return 1;
s[i][j]=9999;
int tem;
if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']'))
{
tem=f(i+1,j-1);
s[i][j]=s[i][j]<tem?s[i][j]:tem;
}
if((a[i]=='(')||(a[i]=='['))
{
tem=f(i+1,j)+1;
s[i][j]=s[i][j]<tem?s[i][j]:tem;
}
if((a[j]==')')||(a[j]==']'))
{
tem=f(i,j-1)+1;
s[i][j]=s[i][j]<tem?s[i][j]:tem;
}
for(int k=i;k<j;++k)
{
tem=f(i,k)+f(k+1,j);
s[i][j]=s[i][j]<tem?s[i][j]:tem;
}
return s[i][j];
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>add;
num=add.size();
a="0"; a+=add;
memset(s,-1,sizeof(s));
cout<<f(1,num)<<endl;
}
return 0;
}