@(k acmer) by 題解工廠
題意:裸的tsp問題,這裡就不再贅述啦*^*
分析:這裡主要是**一下狀態壓縮dp的思想,相比於一般的dp我們都是定義dp
[i][
j],其中的i和j往往是以xx結尾的,長度為xx的意識,他們都有乙個具體的內涵.而在tsp問題中,我們找不到乙個具體的內涵來賦給下標,只能用乙個集合
s 來表示,哪些點走過,哪些點沒有走過.這種把集合用乙個整數的二進位制表達來表示的方法就叫狀態壓縮.
這裡容易想到的是記憶化搜尋,但是像轉換到遞推的實現原理就需要一定的認識(畢竟遞迴要比遞推慢些). 遞推需要遵循的原則是:每一次都是將未知通過狀態轉移方程轉換到已知這裡就需要保證所有的會被轉移到的子問題是已經計算出來的,才能用遞推的方法實現.讓我們來看看本題中為什麼能用遞推的方法實現: dp
[s][
v]=m
in(d
p[su
u][u
]+g[
u][v
])注意到轉移方程,每個子問題得到的集合都是比s更大的集合,也就是s的值更大,所以這就保證了乙個順序,可以按照s從大到小的順序來遞推.
#include
#include
#include
using
namespace
std;
const
int m = int(17), inf = 0x3fffffff, mod = 1000000007;
int t, n, d[17][17], m, dp[1
<< m][m];
void floyd(void)}}
}void solve(void)
dp[(1
<< n) - 1][0] = 0; //已經訪問所有頂點後在0點到0點的距離為0.
for (int s = (1
<< n) - 2; s >= 0; s--) }}
}printf("%d\n", dp[0][0]);
}int main(void)
floyd();
solve();
}return
0;}
Hdu 3811 狀態壓縮 DP
題意 給定數n n 17 求乙個n位數,每位可選1 n中的乙個,且每位不同,並且滿足給定的條件,求方案數。給定條件為m個 x y 表示第x位為y的滿足要求。滿足m中的乙個條件即正確。演算法 dp 狀態壓縮 分析 首先不考慮條件的總方案數為n 我們先算不滿足條件的方案,因為m個條件之間是或者 關係,有...
hdu 1074 狀態壓縮dp
題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...
hdu1565 dp狀態壓縮
題意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。解題思路 先找出所有能成立的狀態,即 i i 1 0,表示每一行都沒有相鄰的,然後遍歷if q j 1 再進行動態更新,用上...