这个题目和刘汝佳的题目一样,就是多了一个让你输出一种补全的匹配情况。就是记录下每个匹配到底是怎么来的就好了。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char bra[101];
int dp[101][101];
int store[101][101];
bool match(char x,char y)
{
if((x=='('&&y==')')||(x=='['&&y==']'))
return true;
else return false;
}
int maxi(int a,int b)
{
if(a>b)
return a;
return b;
}
void output(int kai,int jie)
{
if(kai>jie)
return;
if(kai==jie)
{
if(bra[kai]=='('||bra[kai]==')')
cout<<"()";
else cout<<"[]";
return;
}
if(store[kai][jie]==-1)
{
cout<<bra[kai];
output(kai+1,jie-1);
cout<<bra[jie];
}
if(store[kai][jie]>=0)
{
output(kai,store[kai][jie]);
output(store[kai][jie]+1,jie);
}
}
int main()
{
int length,i,end,start,j,k;
if(gets(bra)==NULL)
return 0;
length=strlen(bra);
for(i=0;i<length;i++)
{
dp[i][i]=0;
dp[i+1][i]=0;
}
for(i=1;i<length;i++)
{
for(start=0;start<=length-1-i;start++)
{
end=start+i;
dp[start][end]=-1;
if(match(bra[start],bra[end]))
{
store[start][end]=-1;
dp[start][end]=maxi(dp[start][end],dp[start+1][end-1]+2);
}
for(k=start;k<end;k++)
if(dp[start][end]<dp[start][k]+dp[k+1][end])
{
store[start][end]=k;
dp[start][end]=dp[start][k]+dp[k+1][end];
}
}
}
output(0,length-1);
cout<<endl;
/*system("pause");*/
return 0;
}