裝壓DP及TSP問題的學習

2021-07-22 17:20:53 字數 991 閱讀 1635

當n比較小的時候(<=20)有可能可以通過裝壓dp求解最優值或方案數,在狀態設計時有一維由壓縮的數表示,方便對各種情況的處理以及減少程式設計難度&時間複雜度。

其實為什麼要裝壓呢?比如我們完全可以設計f[a][b][c][d][e][f][g][h][......]描述狀態,但是這樣是不是看起來很醜呢?我們完全可以設f[i]表示狀態為i時的情況,是不是美觀多了?

tsp問題是裝壓dp的一種,狀態常常設計成f[i][j]表示狀態為i,當前在j時的最小花費。

有時候我們要先做一遍floyd求出兩點之間最小路徑長度,然後轉移,有時卻不要。我覺得大概是強行規定了乙個點只能經過x次的不要floyd(可能會經過乙個點超過x次)沒有規定,只要求遍歷的最小代價的需要floyd(貪心性質)。

無論是幾進製裝壓,2進製3進製哪怕是k進製都是一樣的,只不過2進製可以用位運算簡潔實現操作。其他進製可以先拆成陣列然後逐位操作。

tsp方程:f[i][j]=min(f[i-(1<<(j-1))][k]+cost[k][j]);

裝壓dp的細節很多,做題時需要多加注意。

hdu3001---3進製裝壓tsp,注意不能用floyd!!!

**:#includeusing namespace std;

#define cls(x) memset(x,0,sizeof x)

#define debug(x) cerr<<#x<<"="<=1;i--)

num=num*3+x[i];

return num;

}int check(int x)

; calc(w,x);

for(int i=1;i<=n;i++)

if(w[i]==0) return 0;

return 1;

}int main()

//floyd() 注意不能加!

for(int i=1;i<=n;i++)

f[po[i-1]][i]=0;

for(int i=1;i

狀壓dp求解TSP問題

嘗試過用貪心演算法求解tsp問題,但是並不好用,所以就用上了dp演算法。首先tsp問題滿足最優化原理 對先前決策所形成的狀態而言,其以後的所有決策都構成最優策略。通俗理解就是路徑abcdefg是最短路徑,則bcdefg必是最短路徑。所以可以判斷具有最優子結構和重疊子問題時,該問題可以用動態規劃求解。...

poj3311 TSP問題 狀壓DP

題意 從0走遍1 n最後再返回到0,乙個點可以走多次,求經過的最短距離。分析 由於乙個點可以走多次,所以需要求出任意兩點間的最短距離,就要用到floyd演算法,同時接下來可以搜尋做複雜度是o n 而狀態壓縮的時間效率就高了,關於dp自己有時候狀態轉移方程知道了,卻不知道如何去實現,迴圈時哪層放在外面...

狀壓dp 棋盤問題的學習

有乙個n m n 5,m 1000 的棋盤,現在有1 2及2 1的小木塊無數個,要蓋滿整個棋盤,有多少種方式?答案只需要mod1,000,000,007即可。我也不知道這道題的 qaq n和m的範圍本應是相同的,但是題目給出的n的值很小,這就給我們提供了使用狀壓dp的思路。假設第一列已經鋪滿,則第二...