思路:
dp[i][j] 表示 i到j内的最大匹配数。
更新:如果s[i] 和 s[j] 相匹配,则dp[i][j] = dp[i+1][j-1] + 2;
#include <iostream>
#include <string.h>
using namespace std;
const int maxn =110;
int dp[maxn][maxn];
string s;
bool judge(int i,int j)
{
if( (s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
{
return 1;
}
return 0;
}
int main()
{
while(cin>>s && s != "end")
{
memset(dp,0,sizeof dp);
for(int len = 1; len < s.size(); len++)
{
for(int l = 0, r = l + len; r < s.size(); l++,r++)
{
if(judge(l,r))
{
dp[l][r] = dp[l+1][r-1] + 2;
}
for(int k = l; k < r; k++)
{
dp[l][r] = max(dp[l][r],dp[l][k] + dp[k+1][r]);
}
}
}
cout<<dp[0][s.size()-1]<<endl;
}
return 0;
}