1. 程式人生 > >【洛谷習題】售貨員的難題

【洛谷習題】售貨員的難題

const cstring close turn style 題目 圖片 img lin

題目鏈接:https://www.luogu.org/problemnew/show/P1171


比較經典的狀壓DP吧,就是最後一個點不開O2卡不過去。。。

主要是對位運算熟,註意f[1][0]=0,其他狀態為正無窮,別的看代碼吧。

技術分享圖片
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 inline int get_num() {
 7     int num = 0;
 8     char c = getchar();
 9     while
(c < 0 || c > 9) c = getchar(); 10 while (c >= 0 && c <= 9) 11 num = num * 10 + c - 0, c = getchar(); 12 return num; 13 } 14 15 const int maxn = 20; 16 17 int dist[maxn][maxn], f[1 << maxn][maxn]; 18 19 int main() { 20 int n, ans = 0x3f3f3f3f
; 21 n = get_num(); 22 for (register int i = 0; i < n; ++i) 23 for (register int j = 0; j < n; ++j) 24 dist[i][j] = get_num(); 25 memset(f, 0x3f, sizeof(f)); 26 f[1][0] = 0; 27 for (register int i = 1; i < 1 << n; ++i) 28 for (register int
j = 0; j < n; ++j) if (i >> j & 1) 29 for (register int k = 0; k < n; ++k) if ((i ^ 1 << j) >> k & 1) 30 if (f[i ^ 1 << j][k] + dist[k][j] < f[i][j]) 31 f[i][j] = f[i ^ 1 << j][k] + dist[k][j]; 32 for (register int i = 0; i < n; ++i) 33 if (f[(1 << n) - 1][i] + dist[i][0] < ans) 34 ans = f[(1 << n) - 1][i] + dist[i][0]; 35 printf("%d", ans); 36 return 0; 37 }
90分代碼

【洛谷習題】售貨員的難題