狀壓dp POJ 3311 旅行商問題

2021-09-24 18:36:27 字數 1695 閱讀 4862

題目大意:

poj這題是變形:

乙個送外賣的人,要將外賣全部送去所有地點再回到店裡,求最短路。店在0點。

因為這裡可以重複經過每個地點。所以首先用floyd求出最短路,然後再進行dp即可

我看題解基本上都是遞推dp,我寫的記憶化搜尋。因為沒有刪除別人的變數定義,導致陣列開小,又debug了2個小時。

遞推的思路也不難

dp[s][j]表示經過s集合中的點,j是最後乙個經過的點的最短路徑。

刷表法:列舉i, j。j必須在集合中存在,i必須不存在。

dp[ s^(1/dfs

#include

#define inf 100000000

using

namespace std;

int dis[12]

[12];

int dp[12]

[(1<<12)

];int n;

intdfs

(int i,

int s)

if(s==0)

dp[i]

[s]=inf;

for(

int j=

0;jreturn dp[i]

[s];

}int

main()

}memset

(dp,-1

,sizeof

(dp));

//最短路

for(

int k =

0;k <= n;

++k)}}

} cout<<

dfs(0,

(1<

)<

}return0;

}

//遞推
#include

#define inf 100000000

using

namespace std;

int dis[12]

[12];

int dp[(1

<<12)

][12]

;int n;

intmain()

}memset

(dp,-1

,sizeof

(dp));

//最短路

for(

int k =

0;k <= n;

++k)}}

}memset

(dp,3,

sizeof

(dp));

for(

int s=

0;s<

;s++

)for

(int j=

0;j}}

}int min=inf;

for(

int i=

1;i<=n;i++

) cout<

}return0;

}

poj3311 TSP問題 狀壓DP

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

狀壓dp POJ 3254 農夫玉公尺田

轉大佬的思路 對於0 1狀態矩陣,自然而然會想到用狀態壓縮來做,把一行 也可以按列 的狀態壓縮成乙個十進位制數 行狀態 另種植or不種植也可以用0 1表示,並根據題目所說不能挨著種植,即這一行的某個位置種植了,下一行的同一位置就不能種植,可以知道兩行的種植狀態相位與要為0。另外說乙個行種植狀態有效,...

狀壓DP《旅行商問題》

旅行社問題就是給乙個有向圖,從點0走一圈全部結點再走回來所花費的費用最少是多少。狀壓dp一般n 15。因為是走完全部點,那麼走到2點的費用有可能走了5,也可能沒走,那麼就不能簡單的用最短路來找。因為要求跑完全部點回到0,而最小樹形圖的話無法做到。狀壓dp是指在乙個點上存在多種狀態,這些狀態可以用二進...