题解 P1171 【售货员的难题】

0AND1STORY

2018-11-05 20:27:27

Personal

这是一道典型的状压题~~(虽然不开O2最后一个点要T掉)~~ 废话不多说,直接上代码: ```cpp #include <bits/stdc++.h> #define inf 0x7f7f7f7f const int maxn = 25; const int maxm = 1100010; int n, ans = inf; int dp[maxm][maxn], map[maxn][maxn]; int main() { scanf("%d", &n); for (register int i = 1; i <= n; i ++) for (register int j = 1; j <= n; j ++) scanf("%d", &map[i][j]); memset(dp, 0x7f, sizeof dp); dp[1][1] = 0; for (register int i = 0; i < (1 << n); i ++) for (register int j = 1; j <= n; j ++) if (!(i & (1 << (j - 1)))) for (register int k = 1; k <= n; k ++) if (i & (1 << (k - 1))) dp[i | (1 << (j - 1))][j] = std::min(dp[i | (1 << (j - 1))][j], dp[i][k] + map[k][j]); for (register int i = 2; i <= n; i ++) ans = std::min(ans, dp[(1 << n) - 1][i] + map[i][1]); printf("%d\n", ans); return 0; } ```