记队员连过两道而我却卡在银联极客读题,*****!!!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
int n;
ll ans=0,sum=0;
ll m[30][30];
int A[15],B[15];//记录AB队员编号
void dfs(int an,int bn,ll t) //目前AB队人数及剩余的未断关系
{
if(t<ans) return; //剪枝:若剩余未断关系已经小于已知最优答案,立即回溯
if(an>n||n<bn) return ;
int k=an+bn+1;
if(k>n*2) {ans=max(t,ans); return;}
ll tA=t,tB=t;
//k号归为B组
B[bn]=k;
for(int i=0;i<bn;i++)
tB-=m[B[i]][k];
dfs(an,bn+1,tB);
//归为A组
A[an]=k;
for(int i=0;i<an;i++)
tA-=m[k][A[i]];
dfs(an+1,bn,tA);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
for(int j=1;j<=n*2;j++)
{
scanf("%lld",&m[i][j]);
if(j<i) sum+=m[i][j];
}
dfs(0,0,sum);
cout<<ans<<endl;
return 0;
}
/*
2
0 3 2 1
3 0 4 1
2 4 0 8
1 1 8 0
*/