我发现钻牛角尖的时候一定要换道题写的!
寒假的时候看到这个题的时候就想到了递归的写法,意料之中的超时的,但是我就是想不起来怎么用数组动态规划来写,很简单但是就想不起来,今天一看就写出来了,哎!
#include<iostream>
#include<string>
using namespace std;
#define Max 100000
char s[105];
int d[105][105],v[105][105],len;
int a[105];
void dp()
{
int i,j,k,tmp;
for(i=0; i<len; i++)
{
d[i][i]=1;
for(j=i+1; j<len; j++)
d[i][j]=Max;
for(j=0; j<i; j++)
d[i][j]=0;
}
for(tmp=1; tmp<len; tmp++)
{
for(i=0; i<len-tmp; i++)
{
j=i+tmp;
if((s[i]=='(' && s[j]==')') || (s[i]=='[' && s[j]==']'))
{
d[i][j]=d[i+1][j-1];
v[i][j]=-1;
}
for(k=i; k<j; k++)
{
int tp=d[i][k]+d[k+1][j];
if(tp<d[i][j])
{
d[i][j]=tp;
v[i][j]=k;
}
}
}
}
// printf("%d\n",d[0][len-1]);
}
void print(int begin,int end)
{
if(begin>end)
return ;
if(begin==end)
{
a[begin]=1;
return;
}
if(v[begin][end]==-1)
print(begin+1,end-1);
else
{
print(begin,v[begin][end]);
print(v[begin][end]+1,end);
}
}
int main()
{
int i;
while(gets(s))
{
len=strlen(s);
if(len==0)
{
printf("\n");
continue;
}
dp();
for(i=0; i<len; i++)
a[i]=0;
print(0,len-1);
for(i=0; i<len; i++)
{
if(a[i]==0)
printf("%c",s[i]);
else
{
if(s[i]=='(' || s[i]==')')
printf("()");
if(s[i]=='[' || s[i]==']')
printf("[]");
}
}
printf("\n");
}
return 0;
}