题意:给你一串由()[ ] 组成的序列,问能匹配的最大长度是多少
思路:区间DP入门,定义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 <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 105
#define LL long long
int cas=1,T;
int dp[maxn][maxn];
int main()
{
string s1;
while (cin >> s1 && s1[0]!='e')
{
memset(dp,0,sizeof(dp));
int len=s1.size();
for (int k=1;k<len;k++)
{
for (int i = 0,j=k;i<len,j<len;i++,j++)
{
if (s1[i]=='(' && s1[j]==')' || s1[i]=='['&&s1[j]==']')
dp[i][j]=dp[i+1][j-1]+2;
for (int kk=i;kk<j;kk++)
dp[i][j]=max(dp[i][j],dp[i][kk]+dp[kk+1][j]);
}
}
printf("%d\n",dp[0][len-1]);
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}