日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[状态压缩DP] COJ 1129 送货到家

發布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [状态压缩DP] COJ 1129 送货到家 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一道狀態壓縮DP;

這道題要求一個無向圖的最小權回路,要求經過所有點,所以可以任選一個點(這里選0)作為起點,以后的狀態f[s, i]表示從0出發到i結束的最小權路徑,最終求得f[1<<n-1, k]后要加上w[0, k],然后求最小值:

for k = 0:n-1

  ans = min(f[1<<n-1, k]+w[0, k]);

print(ans);

1 # include <cstdio> 2 # include <cstring> 3 4 # define N 15 5 # define INF 0X1FFFFFFF 6 7 int n; 8 int f[1<<N][N]; 9 int w[N][N]; 10 11 int min(int x, int y) 12 { 13 return x<y ? x:y; 14 } 15 16 void print(int n, int s) 17 { 18 for (int i = n-1; i >= 0; --i) 19 { 20 printf((s>>i)&0x1 ? "1":"0"); 21 } 22 } 23 24 int dp(int s, int j) 25 { 26 int &ans = f[s][j]; 27 if (ans != -1) return ans; 28 if ((s&(~(1<<j))) == 1) return ans = w[0][j]; 29 ans = INF; 30 for (int k = 1; k < n; ++k) if (k!=j && ((s>>k)&0x1)) 31 { 32 ans = min(ans, dp(s&(~(1<<j)), k)+w[k][j]); 33 } 34 return ans; 35 } 36 37 void solve(void) 38 { 39 int ans = INF; 40 //if (n==0){puts("NoAnswer");return;} 41 // if (n==1){puts("0");return;} 42 for (int i = 0; i < (1<<n); ++i) 43 memset(f[i], -1, sizeof(int)*n); 44 45 f[1][0] = 0; 46 for (int i = 0; i < n; ++i) 47 { 48 ans = min(ans, dp((1<<n)-1, i)+w[0][i]); 49 } 50 if (ans < INF) 51 printf("%d\n", ans); 52 else 53 printf("NoAnswer\n"); 54 } 55 56 void read_graph(void) 57 { 58 for (int i = 0; i < n; ++i) 59 for (int j = 0; j < n; ++j) 60 { 61 scanf("%d", &w[i][j]); 62 if (w[i][j] == 0 && i!=j) 63 w[j][i] = w[i][j] = INF; 64 else w[j][i] = w[i][j]; 65 } 66 } 67 68 int main() 69 { 70 while (~scanf("%d", &n)) 71 { 72 read_graph(); 73 solve(); 74 } 75 76 return 0; 77 }

涉及位運算,多加幾個括號,避免出現優先級導致的問題。

轉載于:https://www.cnblogs.com/JMDWQ/archive/2012/08/05/2623610.html

總結

以上是生活随笔為你收集整理的[状态压缩DP] COJ 1129 送货到家的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。