這個題目題意描述不清,沒有說明只能進入一次。
題目意思很好理解,不再重複。
思路也比較好想,先計算每兩個寶藏區的最短路,和每個寶藏區到邊界的最短路,然後dp解決。
在計算最短路的時候,用優先佇列優化的dijkstra演算法。
在-1的處理上有些小技巧。
但是!但是!!,我之前的思路是dp[i]表示狀態i的最小cost值,並沒有經過嚴格證明和認真思考導致wa好多次。實際上這個思路在計算過程中會導致資訊丟失,下次動鍵盤前一定要證明一下。。
正確的狀態轉移應該是用dp[i][j]表示狀態i並以第j個寶藏結尾的最小cost,這樣每一步計算就儲存了足夠多的資訊了。
話說這就是所謂的旅行商問題了。
#include#include#include
using
namespace
std;
int data[202][202
];int min_d[14][14],tmp_d[202][202
];int out_d[14],k,x[14],y[14
];int gold[202][202
];int
t,n,m;
const
int mx[4]=,my[4]=;
const
int inf = 1000000
;structd};
bool
operator
<(d a,d b)
void
cal_min_d_out_d() }}
}}int
main()
scanf("%d
",&k);
memset(gold,
0,sizeof
(gold));
for(int i=0;i)
gold[x[i]][y[i]]=i+1
; }
cal_min_d_out_d();
int dp[1
<1
];
for(int i=0;i<(1
<)
for(int j=0;j)
dp[i][j]=inf;
for(int i=0;i)
}for(int i=3;i<(1
<) }}
}int ans=inf;
for(int i=0;i1
<1
)][i],ans);
printf(
"%d\n
",ans);
}}
旅行商問題
旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...
旅行商問題
一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...
旅行商問題
題意 旅行商問題,即從 1 走到 n 不重不漏,然後求最小距離。題解 狀態壓縮dp,顯然的是,要從某種狀態到某種狀態並且合法,然後取 min 然後全部遍歷。所以設 dp 的含義是,最後乙個點是 i 點,然後走過了 j 這個 01 串的有 1 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 ...