题意:括号匹配;
思路:第一次做区间dp的题;好难理解他的存储结构啊。
dp[i][i] 表示 第i个字母到第j个字母有多少个匹配的括号。。a[i][] 表示到达该步的前一步,,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int N = 101;
int dp[N][N];
int s[N][N];
char a[N];
int ans[N];
int len;
void dfs(int l,int r)
{
if(s[l][r]==0){
ans[l]=ans[r] = 1;
dfs(l+1,r-1);
}else if(s[l][r]>0){
dfs(l,s[l][r]);
dfs(s[l][r]+1,r);
}
}
int main()
{
freopen("in.txt","r",stdin);
while(gets(a+1)){
len =strlen(a+1);
if(len==0){
printf("\n");
continue;
}
memset(s,-1,sizeof(s));
for(int d=1;d<len;d++)
for(int i=1;i+d<=len;i++)
{
int j=i+d,t=dp[i][j];
if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']'))
s[i][j]=0,t=dp[i+1][j-1]+1;
for(int k=i;k<j;k++)
if(dp[i][k]+dp[k+1][j]>t)
t=dp[i][k]+dp[k+1][j],s[i][j]=k;
dp[i][j]=t;
}
dfs(1,len);
for(int i=1;i<=len;i++)
if(ans[i]) printf("%c",a[i]);
else{
if(a[i]=='('||a[i]==')') printf("()");
else printf("[]");
}
printf("\n");
}
return 0;
}