只有40长度,dfs一下就好。
由于剪枝,时间复杂度O(2^20)。
#include<bits/stdc++.h>
int a[44],b[44],arr[44],n,flag;
void dfs(int deep,int alen,int blen)
{
if(deep==n||flag)
{
flag=1;
return;
}
if(alen==blen)
{
a[alen+1]=arr[deep];
dfs(deep+1,alen+1,blen);
}
else if(alen>blen)
{
if(a[blen+1]==arr[deep])
{
b[blen+1]=arr[deep];
dfs(deep+1,alen,blen+1);
}
if(alen<n/2)
{
a[alen+1]=arr[deep];
dfs(deep+1,alen+1,blen);
}
}
else
{
if(b[alen+1]==arr[deep])
{
a[alen+1]=arr[deep];
dfs(deep+1,alen+1,blen);
}
if(blen<n/2)
{
b[blen+1]=arr[deep];
dfs(deep+1,alen,blen+1);
}
}
}
int main()
{
int i,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
flag=0;
dfs(0,0,0);
if(flag)
printf("Good job!!\n");
else
printf("What a pity!\n");
}
}