本地运行结果是正确的,交上去却过不了
查看原帖
本地运行结果是正确的,交上去却过不了
218223
chenxsir楼主2020/5/13 13:30

求大佬解答QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
int n,t,d[110][110];
void print(int i,int j);
void dp();
bool match(char a,char b);

int main()
{
	scanf("%d",&t);getchar();
	while(t--)
	{
//		memset(d,0x3f,sizeof d);
		getline(cin,s);
		n=s.size();
		dp();
		print(0,n-1);
		printf("\n");
        if(t)putchar('\n');
	}
} 
bool match(char a,char b)
{
	if(a==' '&&b==' ') return 1;
	if(a=='('&&b==')') return 1;
	else if(a=='['&&b==']') return 1;
	else return 0;
}
void dp()
{
	for(int i=0;i<n;i++)
	{
		d[i+1][i]=0;
		d[i][i]=1;
	}
	for(int i=n-2;i>=0;i--)
	{
		for(int j=i+1;j<n;j++)
		{
			d[i][j]=n;
			if(match(s[i],s[j])) d[i][j]=min(d[i][j],d[i+1][j-1]);
			for(int k=i;k<j;k++)
				d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);
		}
	}
}
void print(int i,int j)
{
	if(i>j) return ;
	if(i==j)
	{
		if(s[i]=='('|| s[i]==')')printf("()");
		else printf("[]");
		return;
	}
	int ans=d[i][j];
	if(match(s[i],s[j])&&ans==d[i+1][j-1])
	{
		printf("%c",s[i]);print(i+1,j-1);printf("%c",s[j]);
		return; 
	}
	for(int k=i;k<j;k++)
		if(ans==d[i][k]+d[k+1][j])
		{
			print(i,k);print(k+1,j);
			return;
		}
}
2020/5/13 13:30
加载中...