DFS or 随机化
dfs: 138K 1738MS


#include <stdio.h> #include <string.h> const int MAXN = 25; int best = 0; int map[MAXN][MAXN], n; bool join[MAXN]; void dfs(int t, int num) { int i, j ; if(num == 0) { int sum = 0; for(i=1; i<=n; i++) for(j=i+1; j<=n; j++) if(join[i] != join[j]) sum += map[i][j]; if( sum > best ) best = sum ; return ; } else { for(i=t; i<=n; i++) { join[t] = true; dfs(i+1, num-1); join[t] = false; if( n-t < num ) return ; } } } int main() { int i, j; scanf("%d", &n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d", &map[i][j]); for(i=1; i<=n/2+1; i++) //枚举集合A的元素个数i,则集合B有n-i元素 { memset(join, 0 ,sizeof(join)); dfs(1, i) ; } printf("%d\n", best); return 0; }
随机算法:我也不清楚cnt 究竟设多大才好 觉得这种算法只能在n很小的时候弄 有投机取巧之嫌。。
168K 282MS


#include <stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> const int MAXN = 25; int best = 0, sum; int map[MAXN][MAXN], n; bool join[MAXN]; void change(int x) { for(int i=1; i<=n; i++) if( join[i] != join[x] ) sum += map[i][x]; else sum -= map[i][x]; } int main() { int i, j; scanf("%d", &n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d", &map[i][j]); memset(join, 0, sizeof(join)); int cnt = 200000; while( cnt -- ) { int x = rand()%n + 1; join[x] = !join[x]; change(x); if( sum > best ) best = sum; } printf("%d\n", best); return 0; }