zoukankan      html  css  js  c++  java
  • 2019牛客网第二场-F题

    基本思路:

    单dfs暴力搜的复杂度为C(2N,N)N^2, N>12会超时,使用两个dfs,并记录过程的累和值将复杂度降低到C(2N,N)N

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll arr[30][30],n;
    ll ans=0,maxsize=0;
    ll brr1[30],brr2[30];
    
    void dfs(ll sum,int pre,int cnt1,int cnt2)
    {
    	if(cnt1==n/2&&cnt2==n/2)
    	{
    		ans=max(sum,ans);
    		return;
    	}
    	ll tmp=0;
    	if(cnt1<n/2)
    	{
    		for(int i=0;i<cnt2;i++)
    		{
    			tmp+=arr[pre][brr2[i]];
    		}
    		brr1[cnt1]=pre;
    		dfs(sum+tmp,pre+1,cnt1+1,cnt2);
    	}
    	tmp=0;
    	if(cnt2<n/2)
    	{
    		for(int i=0;i<cnt1;i++)
    		{
    			tmp+=arr[pre][brr1[i]];
    		}
    		brr2[cnt2]=pre;
    		dfs(sum+tmp,pre+1,cnt1,cnt2+1);
    	}
    
    }
    int main()
    {
    	cin>>n;n=2*n;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>arr[i][j];
    		}
    	} 
    
    	dfs(0,1,0,0);
    
    	cout<<ans<<endl;
    }
    
  • 相关阅读:
    软工人日常
    11.5
    11.4
    11.3
    11.2阅读笔记
    11.1阅读笔记
    10.31 异常
    10.30动手动脑
    10.29
    10.28
  • 原文地址:https://www.cnblogs.com/tldr/p/11220424.html
Copyright © 2011-2022 走看看