海賊王之偉大航路

2022-07-17 11:33:09 字數 1917 閱讀 6557

路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯(那裡藏匿著「唯一的大秘寶」——one piece)。而航程中間,則是各式各樣的島嶼。

因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間的航行時間雖然差別很大,但都是已知的。

現在假設路飛一行從羅格鎮(起點)出發,遍歷偉大航路中間所有的島嶼(但是已經經過的島嶼不能再次經過),最後到達拉夫德魯(終點)。假設他們在島上不作任何的停留,請問,他們最少需要花費多少時間才能到達終點?

input

輸入資料報含多行。

第一行包含乙個整數n(2 < n ≤ 16),代表偉大航路上一共有n個島嶼(包含起點的羅格鎮和終點的拉夫德魯)。其中,起點的編號為1,終點的編號為n。

之後的n行每一行包含n個整數,其中,第i(1 ≤ i ≤ n)行的第j(1 ≤ j ≤ n)個整數代表從第i個島嶼出發到第j個島嶼需要的時間t(0 < t < 10000)。第i行第i個整數為0。

output

輸出為乙個整數,代表路飛一行從起點遍歷所有中間島嶼(不重複)之後到達終點所需要的最少的時間。

sample input

樣例輸入1:

40 10 20 999

5 0 90 30

99 50 0 10

999 1 2 0

樣例輸入2:

50 18 13 98 8

89 0 45 78 43

22 38 0 96 12

68 19 29 0 52

95 83 21 24 0

sample output
樣例輸出1:

100樣例輸出2:

137

對於樣例輸入2:可能的路徑及總時間為:

1,2,3,4,5: 18+45+96+52=211

1,2,4,3,5: 18+78+29+12=137

1,3,2,4,5: 13+38+78+52=181

1,3,4,2,5: 13+96+19+43=171

1,4,2,3,5: 98+19+45+12=174

1,4,3,2,5: 98+29+38+43=208

所以最短的時間花費為137

單純的列舉在n=16時需要14!次運算,一定會超時。

#include

#include

#include

using namespace std;

int num;

int time[16][16]; //儲存輸入的時間,好像名字命名為time就會compile error

int dp[1 << 15][15]; //儲存登過的島的二進位制序列為s且最後乙個上過的島為i的時候最少用多少時間

int main()

if (dp[s][j] != 0) //已經填充過

continue;

dp[s][j] = 1 << 30;

int tmp = s - (1 << j);

//找到最好的那個解,相當於動態規劃

//我們只需要關注在j之前的那個島i的位置和時間

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

if (s&(1 << i) && (i != j))

dp[s][j] = min(dp[s][j], dp[tmp][i] + time[i + 1][j + 1]);}}

int k = 1 << 30;

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

k = min(k, dp[lim][i] + time[i + 1][num - 1]);

cout << k << endl;

return 0;

}

海賊王之偉大航路

題目鏈結 思路 基本狀壓dp 看題目知道此題求的是最短哈密頓路徑,也就是一條從1到n的經過所有點的最短路徑。我們可以使用狀態壓縮,使用乙個二進位制數state代表一種狀態,state代表經過的所有點的集合。例如state 1,代表只經過1號點。state 3 二進位制為0011 代表經過1號點和2號...

百練4124 海賊王之偉大航路

路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間的航行時間雖然差別很大,...

ACM 海賊王之偉大航路 深搜剪枝

我是要成為海賊王的男人!路飛他們偉大航路行程的起點是羅格鎮,終點是拉夫德魯 那裡藏匿著 唯一的大秘寶 one piece 而航程中間,則是各式各樣的島嶼。因為偉大航路上的氣候十分異常,所以來往任意兩個島嶼之間的時間差別很大,從a島到b島可能需要1天,而從b島到a島則可能需要1年。當然,任意兩個島之間...