百練4124 海賊王之偉大航路

2021-08-28 20:59:06 字數 1626 閱讀 7565

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

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

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

輸入輸入資料報含多行。

第一行包含乙個整數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。

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

樣例輸入

樣例輸入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

樣例輸出

樣例輸出1:

100樣例輸出2:

1371.深搜加剪枝

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=16;

int g[maxn][maxn],best[maxn][(1void dfs(int u,int cur,int k)

for(int v=0;vif(g[u][v]&&(k&(1<}

int main()

2.狀態轉移方程

dp[state][land] :在狀態 state ,所在島嶼為 land 的情況下已經花去的時間

state 代表目前的狀態。以二進位制數表示,如第3位二進位制位為1就表示第3座島嶼(不含起點島嶼)已被訪問過。

land 表示當前所在的島嶼。所以 solve(int state,int land) 的最終狀態(需要最終輸出的值)永遠都是 land=n-1 (在終點島嶼的時候)

#include

#include

#include

#include

using namespace std;

int g[20][20];

int dp[(1<<16)+5][20];

int main()

}dp[1][1] = 0;

int ans = (1cout << dp[ans][n] << endl;

}return 0;

}

百練 4124 海賊王的偉大航路

這裡所需要的剪枝一共有三種 1.若走到現在的路程已經大於等於之前擴充套件的最優路程,則剪枝 2.設乙個估計函式,這個估計函式是現在已經還沒有走的點,若有c1,c2.cn,則取終點為c1的最短路徑,到c2的最短路徑.到cn的最短路徑,他們之和相加若仍然大於等於之前擴充套件的最優路程,那麼就不用繼續擴充...

海賊王之偉大航路

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

海賊王之偉大航路

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