只有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");
}
}

本文介绍了一种使用深度优先搜索(DFS)算法解决特定配对问题的方法。该问题限定于输入序列长度不超过40,通过巧妙地利用剪枝技巧,确保了算法的时间复杂度在可控范围内(约O(2^20))。文章提供了完整的C++实现代码,并通过实例演示了如何根据输入数据递归地寻找可行解。
660

被折叠的 条评论
为什么被折叠?



