这题意思就是让人两两组队,然后求出各组值全异或之后的最大值。 看懂了题目就能感觉套一个dfs的模板,简单的是一个个找过去,不过如果标记的时候把当前对象和他的队友一起标记了后面也要一起变回来。
using namespace std;
long long int n,a[10001][10001],b[1001];//a数组收集两人的值,b用来标记是否已经组队
long long int maxx;//记录最大值
void xxor(int t,long long int xorr)
//dfs,t表示在给t找队友,xorr来记录当前所有组的值异或起来的值
{
if(t>2*n){maxx=max(xorr,maxx);return;}//所有人找过一遍后比较大小
if(b[t]==0)b[t]++;//这里的标记可有可无,但如果有后面的b[t]--就不能忘掉
else {xxor(t+1,xorr);return;}
for(int i=t+1;i<=2*n;i++)
{
if(b[i]==0)
{
b[i]++;
xxor(t+1,xorr^a[t][i]);
b[i]--;
}
}
b[t]--;
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=2*n-1;i++)
{
for(int j=i+1;j<=2*n;j++)//从i+1开始方便记录和调用
{
cin>>a[i][j];
}
}
xxor(1,0);
cout<<maxx<<endl;
return 0;
}
理论上可以以组数来判断是否全部有队友,但还要再来个变量来记录组数,思路还是dfs的应该差不多。



京公网安备 11010502036488号