经典的括号匹配DP题,按着书上做的,结果书上多写了个continue
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=110;
const int inf=1<<29;
char str[maxn];
int len,dp[maxn][maxn],p[maxn][maxn];
void Print(int l,int r)
{
if(l>r)
return;
if(l==r)
{
if(str[l]=='['||str[l]==']')
printf("[]");
else
printf("()");
}
else if(p[l][r]==-1)
{
printf("%c",str[l]);
Print(l+1,r-1);
printf("%c",str[r]);
}
else
{
Print(l,p[l][r]);
Print(p[l][r]+1,r);
}
}
int main()
{
while(gets(str)!=NULL)
{
len=strlen(str);
if(len==0)
{
printf("\n");
continue;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<len;i++)
dp[i][i]=1;
for(int l=1;l<len;l++)
{
for(int i=0;i<len-l;i++)
{
int j=i+l;
dp[i][j]=inf;
if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']'))
{
dp[i][j]=dp[i+1][j-1];
p[i][j]=-1;
}
for(int k=i;k<j;k++)
if(dp[i][j]>=dp[i][k]+dp[k+1][j])
{
dp[i][j]=dp[i][k]+dp[k+1][j];
p[i][j]=k;
}
}
}
Print(0,len-1);
printf("\n");
}
return 0;
}