区间dp,输出路径
调了好久好久。。。忧伤。。。
每一个需要增加括号才能匹配的括号,把括号加在它的边上。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
int dp[305][305],a[305][305],visit[305];
char s[305],re[305];
int dfs(int le,int ri)
{
// printf("*%d %d %d\n",le,ri,dp[le][ri]);
int i,j,k,l;
if(dp[le][ri]!=-1)
return dp[le][ri];
if(le>ri)
{
dp[le][ri]=0;
a[le][ri]=-1;
return 0;
}
if(le==ri)
{
dp[le][ri]=1;
a[le][ri]=-1;
return 1;
}
dp[le][ri]=dfs(le+1,ri)+1;
a[le][ri]=le;
for(i=le;i<ri;i++)
{
if(dfs(le,i)+dfs(i+1,ri)<dp[le][ri])
{
dp[le][ri]=dp[le][i]+dp[i+1][ri];
a[le][ri]=i;
}
}
if((s[le]=='('&&s[ri]==')')||(s[le]=='['&&s[ri]==']'))
{
if(dfs(le+1,ri-1)<dp[le][ri])
{
dp[le][ri]=dp[le+1][ri-1];
a[le][ri]=-1;
}
}
// printf("#%d %d %d\n",le,ri,dp[le][ri]);
return dp[le][ri];
}
void dfs2(int le,int ri)
{
// printf("tyou%d %d %d\n",le,ri,a[le][ri]);
if(a[le][ri]==-1)
{
if(le==ri)
visit[le]=1;
if(dp[le][ri]>0)
dfs2(le+1,ri-1);
}
else
{
dfs2(le,a[le][ri]);
dfs2(a[le][ri]+1,ri);
}
}
int main()
{
int i,j,k,l,len;
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
while(gets(s)>0)
{
len=strlen(s);
memset(dp,-1,sizeof(dp));
memset(a,-1,sizeof(a));
dfs(0,len-1);
// for(i=0;i<len;i++)
// for(j=0;j<len;j++)
// printf("%d %d %d\n",i,j,dp[i][j]);
memset(visit,0,sizeof(visit));
dfs2(0,len-1);
for(i=0;i<len;i++)
{
if(visit[i]==1)
{
if(s[i]=='('||s[i]==')')
printf("()");
else
printf("[]");
}
else
printf("%c",s[i]);
}
printf("\n");
// for(i=0;i<len;i++)
// for(j=0;j<len;j++)
// printf("we%d %d %d\n",i,j,a[i][j]);
// for(i=0;i<len;i++)
// printf("$%d %d\n",i,visit[i]);
}
return 0;
}