dfs剪枝减去很多才能过,0MS过了,真的很不错,可能满足的情况有很多种,所以就可以过了,如果要输出所有情况,那就麻烦了
#include <cstdio>
#include <cstring>
int n;
int num[2010],v[2010];
bool dfs(int cur,int pos)
{
bool flag=0;
if(cur>=n-2) return 1;
for(int i=cur; i<n-1; ++i)
if(!v[i])
{
v[i]=-1;
for(int j=pos; j<n; ++j)
if(num[j]==num[i]&&!v[j])
{
v[j]=1;
if(dfs(i+1,j+1)) return 1;
v[j]=0;
}
flag=1;
v[i]=0;
break;
}
if(!flag) return 1;
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(v,0,sizeof(v));
for(int i=0; i<n; ++i) scanf("%d",&num[i]);
dfs(0,1);
for(int i=0; i<n; ++i)
if(v[i]==-1) printf("0");
else if(v[i]==1) printf("1");
puts("");
}
return 0;
}