刘汝佳书上的题目,虽然不太一样,但是实质上是一样的。同学们可以参看黑书113页。
#include<iostream>
#include<string>
using namespace std;
int dp[100][100];
string bra;
bool match(char x,char y)
{
if((x=='('&&y==')')||(x=='['&&y==']'))
return true;
else return false;
}
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int length,i,j,start,end,k;
while(cin>>bra)
{
if(bra=="end")
break;
length=bra.size();
for(i=0;i<length;i++)
{
dp[i][i]=0;
dp[i+1][i]=0;
}
for(i=1;i<=length-1;i++)
for(start=0;start<=length-1-i;start++)
{
end=start+i;
dp[start][end]=0;
if(match(bra[start],bra[end]))
dp[start][end]=maxi(dp[start][end],dp[start+1][end-1]+2);
for(k=start;k<end;k++)
dp[start][end]=maxi(dp[start][end],dp[start][k]+dp[k+1][end]);
}
cout<<dp[0][length-1]<<endl;
}
return 0;
}