最大两队竞争值(暴力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 }