zoj 3471
状态压缩 dp
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 105
#define INF 0x3f3f3f3f
#define inf 10000000
#define MOD 100000000
#define ULL unsigned long long
#define LL long long
#define _setm(A) memset(A, INF, sizeof(A))
using namespace std;
int n, g[15][15], dp[1<<15];
int main() {
// freopen("in.txt", "r", stdin);
while(scanf("%d", &n) == 1 && n) {
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; ++ i) {
for(int j = 0; j < n; ++ j) {
scanf("%d", &g[i][j]);
}
}
for(int i = (1<<n)-1; i >= 0; -- i) {
for(int j = 0; j < n; ++ j) {
if((i&(1<<j)) == 0) continue;
for(int k = 0; k < n; ++ k) {
if(j == k || (i&(1<<k)) == 0) continue;
int nS = i-(1<<k);
dp[nS] = max(dp[nS], dp[i]+g[j][k]);
}
}
}
int ans = 0;
for(int i = 0; i < (1<<n); ++ i) {
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
}
return 0;
}

浙公网安备 33010602011771号