简单搜索:
#includeusing namespace std; const int N =20; int g[N][N]; int n; int ans=0; int f[N]; bool st[N]; void dfs(int k) { if(k>2*n) { int res=0; for(int i=1;i<=2*n;i+=2) { res=res^(g[f[i]][f[i+1]]); } ans=max(ans,res); } for(int i=1;i<=2*n;i++) { if(st[i]) continue; f[k]=i; st[i]=true; dfs(k+1); st[i]=false; } } int main() { cin>>n; int x; for(int i=1;i<=2*n;i++) for(int j=i+1;j<=2*n;j++) { cin>>x; g[i][j]=g[j][i]=x; } dfs(1); cout< 然而这样会超时,优化之后如下:
#includeusing namespace std; const int N =20; typedef long long ll; ll g[N][N]; int n; ll ans=0; ll f[N]; bool st[N]; void dfs(ll res) { int i=1; while(i<=2*n&&st[i]) i++; if(i>2*n){ ans=max(res,ans); return ; } for(int j=i+1;j<=2*n;j++) if(!st[j]) { st[i]=st[j]=true; dfs(res^g[i][j]); st[i]=st[j]=false; } } int main() { cin>>n; ll x; for(int i=1;i<=2*n;i++) for(int j=i+1;j<=2*n;j++) { cin>>x; g[i][j]=x; } dfs(0); cout<



