牛客暑期多校(二) F

记队员连过两道而我却卡在银联极客读题,*****!!!

#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
*/

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务