题意
给你一些括号问你最大的匹配括号数是多少
思路
区间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])
初始化dp为0
如果题目问的是加最少的括号使得该序列满足所有都匹配的话
ans=n-dp[0][n-1]
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char str[111];
while(scanf("%s",str)&&str[0]!='e')
{
int dp[111][111];
memset(dp,0,sizeof(dp));
int len=strlen(str);
for(int i=len-1;i>=0;i--)
{
for(int j=0;j<len;j++)
{
if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']')) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
for(int k=i;k<j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}