解题思路:
状态转移方程为
dp[i][j]表示第i位和第j位字符间匹配数
当s[i]匹配s[j]时 dp[i][j]=dp[i+1][j-1]+2
然后 还有一部不论匹不匹配,都要
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j])
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[105][105];
char s[105];
bool mtch(char c1,char c2)
{
if(c1=='('&&c2==')') return true;
if(c1=='['&&c2==']') return true;
return false;
}
void solve()
{
memset(dp,0,sizeof(dp));
int l=strlen(s);
for(int d=1;d<l;d++)
{
for(int i=0;i+d<l;i++)
{
int j=i+d;
if(mtch(s[i],s[j]))
{
dp[i][j]=dp[i+1][j-1]+2;
}
for(int k=i;k<=j-1;k++)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
int main()
{
//freopen("t.txt","r",stdin);
while(1)
{
scanf("%s",s);
if(s[0]=='e') break;
solve();
printf("%d\n",dp[0][strlen(s)-1]);
}
return 0;
}