HDU 5067 狀態壓縮DP TSP

2021-08-07 04:47:43 字數 1097 閱讀 9286

題意:

​ 有n∗

m 的地圖,地圖上有一些石頭,現在需要用最短的時間去到達這些石頭,單位距離所花費的時間為1.

思路:

​ 單單去看原題是具有迷惑性質的,講了很多亂七八糟的,所以在看題的時候需要抽象化問題,這道題因為清理石頭不花費時間,而費時間的是如何到達所有石頭才最快,也就是距離最短,經典的tsp問題,而石頭的位置不超過10個,所以可以把石頭的狀態壓縮在數字中,state為當前已經到達過的位置,now為當前的位置,其dp狀態為:dp

[sta

te][

now]

接下來需要多少時間去到達所有位置,很明顯,要求的是:dp

[0][

0],而dp

[(1

][0]

=0,其中pos 為石頭位置的個數。

​ 如何尋找最短的距離呢?通過當前的狀態去向沒有達到的位置去遍歷,儲存最小的值便是結果。

​ 實現的方法有兩種:dfs容易理解,直接迴圈dp也很方便,

​ dfs就是尋找達到此狀態的最小值,而迴圈dp是暴力列舉當前狀態所有可能達到的狀態的最小值。-

#include 

#include

#include

#include

using namespace std;

const int maxn = (1

<<11) + 10;

const int inf = 0x3f3f3f3f;

int n,m;

int dp[maxn][15];

int dx[15],dy[15],pos;

int dfs(int

state,int now)

int dp()}}

/*memset(dp,-1,sizeof(dp));

printf("%d\n",dfs(0,0));*/

memset(dp,inf,sizeof(dp));

dp();

printf("%d\n",dp[0][0]);

}return

0;}

hdu 5067 狀態壓縮dp

解題思路 這道題開始想複雜了,想用bfs去求出最短距離,其實沒必要,因為題目中沒有阻礙關係,所以可以兩點之間的最短距離可以用曼哈頓距離。剩下的就是乙個普通的tsp問題了,狀態壓縮dp include include include define inf 0x3f3f3f using namespac...

HDU 5067 狀態壓縮DP TSP

題目鏈結 題目大意 藍翔挖掘機挖石子。把地圖上所有石子都運回起點,問最少耗時。解題思路 首先得yy出來。最少耗時肯定是從起點出發,把所有石子點走一遍且只走一遍,把石子裝在車上,然後最後回到起點。由於石子堆最多也就10個。不難看出這就是個裸的tsp。首先bfs計算出每個石子間的最短路。當時打bc的時候...

hdu1074狀態壓縮

很明顯的狀態壓縮題目。當然了如果他的意識只有是求最小值沒有要求輸出那個輸出的順序,那麼直接用揹包,甚至是貪心都是可以做出來的,但是要求順序這個揹包的話沒有辦法吧資料記錄下來。所以用二進位制壓縮。所謂的二進位制壓縮就是用二進位制來表示事情的完成程度和狀況,比如1,就是0000001表示第乙個作業做了,...