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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

發(fā)布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 題目解答
      • 題目鏈接

題目解答

分析:

狀態(tài)壓縮dp是用二進制數(shù)來表示狀態(tài)。
數(shù)據(jù)范圍n = 20, 那么狀態(tài)總量就是2202^{20}220個狀態(tài)。

可以按照以下思路去思考:

  • 哪些點被用過
  • 當前停在哪個點上
  • 狀態(tài)表示

    f[i][j]f[i][j]f[i][j]表示狀態(tài)為i,且停在點j的最短Hamilton路徑的長度。

    狀態(tài)轉(zhuǎn)移:

    state_k 是1個狀態(tài)的集合,其中不包括狀態(tài)j, f[state][j] = f[state_k][k] + weight[k][j]

    補充一個常用的技巧:

    i >> j & 1

    這里的運算優(yōu)先級需要知道: 右移運算符(>>)的優(yōu)先級高于 位運算,所以這里先計算(i >> j),含義是i的二進制表示右移j位,也就是找到了i的第j位,然后與1(&1),含義是判斷這一位是否為1.(當然,這里的位,都是指二進制下的某一位)。

    綜上,i >> j & 1表示 i的二進制表示中第j位是否為1.

    同樣的道理,讀者可以分析一下下面這句代碼

    i -(1 << j) >> k & 1

    提示: 減法優(yōu)先級 高于 右移(>>),右移(>>)優(yōu)先級高于 位運算與(&),上面這句話等同于

    (i - (1 << j)) >> k & 1

    ac代碼

    #include<bits/stdc++.h> using namespace std;const int N = 20, M = 1 << 20; // 狀態(tài) int n; // f[i][j] 表示狀態(tài)是i 的情況下,停在點j時的最短路徑是多少 int f[M][N], weight[N][N]; // 邊權(quán)int main(){cin >> n;for(int i = 0; i < n; i ++)for(int j = 0; j < n; j++)cin >> weight[i][j];memset(f, 0x3f, sizeof f);f[1][0] = 0; for(int i = 0; i< 1 << n; i ++){for(int j = 0; j < n; j ++){if( i >> j & 1) //判斷整數(shù)二進制表示的第j位是否是1for(int k = 0; k < n; k ++){// 看一下state_k 這個狀態(tài)// 減法優(yōu)先級 高于 右移>>,右移優(yōu)先級高于 位運算&if( i -(1 << j) >> k & 1)f[i][j] = min(f[i][j], f[i - (1<< j)][k] + weight[k][j]);}}}// 把所有點都遍歷過,并且停在了n-1這個點cout << f[(1 << n) -1][n -1] << endl; }

    題目鏈接

    https://www.acwing.com/problem/content/93/

    總結(jié)

    以上是生活随笔為你收集整理的《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。