可以把括号变成01序列,处理方便。
注意题目要求n不超过20,意味这个序列里匹配好的括号不会超过10。
时间要求有1000MS,十分充裕,不需要高效的算法。直接模拟即可。
此类题注意不要过度复杂化。
#include<cstdio>
bool str[1000];
int k=0;
void add(int x)
{
for(int i=1;i<=x;i++) str[k++]=0;
str[k++]=1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
k=0;
int n;
scanf("%d",&n);
int a[n];
scanf("%d\n",&a[0]);
add(a[0]);
for(int i=1;i<n;i++)
{
scanf("%d",&a[i]);
add(a[i]-a[i-1]);
}
int ans[n],u=0;
for(int i=0;i<k;i++)
{
if(str[i]==1)
{
int repare=1,pare=0;
for(int j=i-1;j>=0;j--)
{
if(str[j]==0)
{
pare++;
repare--;
}
else if(str[j]==1) repare++;
if(repare==0) break;
}
ans[u++]=pare;
}
}
for(int i=0;i<u;i++)
{
printf("%d",ans[i]);
if(i!=u-1) printf(" ");
}
printf("\n");
}
return 0;
}