简单的dfs,题意为:将整个分为2部分,相同部分的通信无话费,求最大的话费。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX(a1,b1) (a1)>(b1)?(a1):(b1)
using namespace std;
const int N = 21;
int n,ans,map[N][N];
bool vis[N];
void dfs(int i,int sum)
{
if(i>n)
{
ans = MAX(sum,ans);
return;
}
vis[i] = false;
int tmp = 0;
for(int e=1;e<i;++e)
if(vis[e]==true)
tmp += map[i][e];
dfs(i+1,sum+tmp);
vis[i] = true;
tmp = 0;
for(int e=1;e<i;++e)
if(vis[e]==false)
tmp += map[i][e];
dfs(i+1,sum+tmp);
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&map[i][j]);
ans = -1;
dfs(1,0);
cout<<ans<<endl;
return 0;
}