二进制状态压缩DP
描述
給定一張 n 個點的帶權無向圖,點從 0~n-1 標號,求起點 0 到終點 n-1 的最短Hamilton路徑。 Hamilton路徑的定義是從 0 到 n-1 不重不漏地經過每個點恰好一次。
輸入格式
第一行輸入整數n。
接下來n行每行n個整數,其中第i行第j個整數表示點i到j的距離(記為a[i,j])。
對于任意的x,y,z,數據保證 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。
輸出格式
輸出一個整數,表示最短Hamilton路徑的長度。
數據范圍
1≤n≤20
0≤a[i,j]≤107
輸入樣例:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
輸出樣例:
18
一看到這道題目的時后我們一眼就覺得這是一道搜索題,但是我們仔細分析一下時間復雜度:
頭尾都是確定的,因此我們要對中間的(n - 2)個數進行全排列,大概就是(n - 2)!次方次排列,于是我們自然而然的就想到了用DP來絕決這個問題,但是用DP我們又該怎么樣來表示這之間的狀態呢。
每一個位置我們用0,1,來表示。0代表沒走過,1代表已近走過,
由此我們就有了狀態轉移方程。
DP[A][j] = min(DP[A][j], DP[B][k] + value[k][j])
其中A、B,分別時兩個集合。B集合加上點 j 等于A集合。
每個狀態用其第幾位的二進制是0或者1來表示
我們有了下面的代碼
總結
- 上一篇: 杏花粉的功效与作用、禁忌和食用方法
- 下一篇: 陈年陈皮的功效与作用、禁忌和食用方法