最大两队竞争值(暴力dfs)--牛客多校第二场

题意:

给你2n个人,两两有对立竞争值,问你分成两队最大的竞争值是多少。

思路:

直接暴力dfs,稍微有点卡,3800ms。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<string>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #define LL long long
12 const LL mod=1e9+7;
13 const LL inf=0x3f3f3f3f;
14 const LL inff=0x3f3f3f3f3f3f3f3f;
15 #define ME0(x) memset(x,0,sizeof(x))
16 #define MEF(x) memset(x,-1,sizeof(x))
17 #define MEI(x) memset(x,inf,sizeof(x))
18 using namespace std;
19 int n,v[30][30],vis[30];
20 LL ans=-1;
21 void dfs(int cnt,int x,LL sum)
22 {
23     for(int i=1;i<=2*n;i++)
24     {
25         if(!vis[i])
26         {
27             sum=sum+v[x][i];
28         }
29         else
30         {
31             sum=sum-v[x][i];//多加了的部分要减去
32         }
33     }
34     if(cnt+2*n-x<n)
35     {
36         return ;
37     }
38     if(cnt==n)
39     {
40         if(ans<sum)
41         {
42             ans=sum;
43         }
44         return ;
45     }
46     for(int i=x+1;i<=2*n;i++)
47     {
48         if(!vis[i])
49         {
50             vis[i]=1;
51             dfs(cnt+1,i,sum);
52             vis[i]=0;
53         }
54     }
55 }
56 int main()
57 {
58     scanf("%d",&n);
59     for(int i=1;i<=2*n;i++)
60     {
61         for(int j=1;j<=2*n;j++)
62         {
63             scanf("%d",&v[i][j]);
64         }
65     }
66     ME0(vis);
67     dfs(0,0,0);
68     printf("%lld\n",ans);
69     return 0;
70 }

猜你喜欢

转载自www.cnblogs.com/--HPY-7m/p/11436917.html