[狀壓dp] 最短Hamilton路徑(模板題+狀壓dp)
文章目錄
0. 前言
狀壓 dp
就是採用二進位制數儲存狀態,方便進行位運算操作。例如 八皇后、八數碼問題也都是採用了狀態壓縮的思想來使用一個二進位制數唯一對應集合中的一個狀態。
關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。
1. 狀壓dp 模板題
這個問題如果暴力來做的話,首先需要確定走過 0~n-1
這些點的順序,這個就是 n!
,然後再求長度,是 n
,那麼總共就是 n!*n
時間爆炸…
狀壓 dp
思路:
重點: 狀壓 dp
思路:
- 狀態定義:
f[i][j]
:所有從 0 號點走到j
號點,走過的所有點狀態壓縮為i
的所有路徑的最小值。- 狀壓方式為:因為只有 20 個點,即將
i
看作一個二進位制數,取其前 20 位,每一位 01 代表這個點是否走過
- 狀態轉移:
- 分類依據:所有路徑都是從 0 走到
j
的,中間走過的所有點是i
。可以以當前路徑的倒數第二個點進行分類,有:- 倒數第二個點是第 0 號點
- 倒數第二個點是第 1 號點
- 倒數第二個點是第 2 號點
- 倒數第二個點是第 n-1 號點
- 則這樣就能夠不重不漏的將整個狀態劃分完畢
- 狀態轉移方程:
f[i][j] = f[i - (1 << j)][k] + w[k][j]
- 分類依據:所有路徑都是從 0 走到
- 狀態初始化:
f[1][0]=
0,第 0 個點走向自身的距離為 0。由於取min
,故其它f[i][j]=inf
- 返回答案:
f[(1 << n) - 1][n - 1]
走完n
個點(即0~n-1
二進位制數位均為 1),且走到第n-1
個點的最小值即為答案
本題非常非常非常經典,是狀壓 dp
入門經典題目,不論思路還是程式碼都是很好想的。
程式碼:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 20, M = 1 << N;
int n;
int w[N][N];
int f[M][N];
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> w[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) // 如果路徑包含該點
for (int k = 0; k < n; ++k) // 列舉轉移的點
if ((i - (1 << j)) >> k & 1)// 除去j點,一定包含k這個點,才能走通
f[i][j] = min(f[i][j], f[i - (1 << j)][k] + w[k][j]);
cout << f[(1 << n) - 1][n - 1] << endl; // 走完n個點,且走到第n-1個點的最小值即為答案
return 0;
}
相關文章
- 狀壓DP
- 狀壓 dp
- 一類哈密頓路徑/迴路為背景的狀壓dp
- 狀壓DP基礎入門
- HDU 1074 Doing Homework(狀壓DP)
- 簡易狀態壓縮DP
- CF79D Password (差分+狀壓 dp+最短路/bfs)
- 合理安排(狀壓dp,包括技巧)
- Luogu P1777 幫助 題解 [ 紫 ] [ 線性 dp ] [ 狀壓 dp ]
- E - Remove Pairs(狀壓dp+博弈論)REMAI
- NOI2001 炮兵陣地(狀壓dp)
- Codeforces 11D A Simple Task 題解 [ 藍 ] [ 狀壓 dp ]
- HDU 5816 Hearthstone(狀態壓縮DP+概率)
- 分組(狀壓dp+技巧:快速列舉子集)
- hdu--5418Victor and World+狀態壓縮DP
- bzoj4145: [AMPPZ2014]The Prices(狀態壓縮+Dp)
- 百練4124:海賊王之偉大航路(狀壓DP)
- ACM-ICPC 2018 南京賽區網路預賽__E AC Challenge【狀態壓縮+DP】ACM
- [狀壓dp]leeccode1434:每個人戴不同帽子的方案數(hard)
- 動態規劃——用二進位制表示集合的狀態壓縮DP動態規劃
- 狀態壓縮
- 狀壓 + 網路流 -- Escape HDU - 3605
- 互不侵犯 (狀壓)
- Luogu P5005 中國象棋 - 擺上馬 / Luogu P8756 國際象棋 題解 [ 藍 ] [ 狀壓 dp ] [ 位運算 ]
- dp 套 dp(dp of dp)小記
- HDU 3006 The Number of set (狀態壓縮)
- 論文閱讀 狀態壓縮
- DP套DP
- POJ3279 Fliptile【狀態壓縮+DFS】
- DP 習題(一)
- [DP] 數位DP
- 【DP】Educational DP Contest
- BZOJ5068: 友好的生物(狀壓 貪心)
- 常用揹包dp模板(未完待續)
- dp套dp 隨寫
- dp專題訓練
- 數位dp - 板子題
- POJ 2777 Count Color (線段樹+狀態壓縮)