3 1 1 10 3 1 20 3 30 5 10 2 1 10 2 11
830 4090 1642
J.L. Bentley 建議通過只考慮雙調旅程(bitonic tour)來簡化問題,這種旅程即為從最左點開始,嚴格地從左到右直至最右點,然後嚴格地從右到左直至出發點。下圖(b)顯示了同樣的7個點的最短雙調路線。在這種情況下,多項式的算法是可能的。事實上,存在確定的最優雙調路線的O(n*n)時間的算法。
圖a 圖b<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+16I61NrSu7j2taXOu9WkJiMyNjY4NDvJz8/Uyr61xMa9w+bJz7XExt+49rXjoaMgYSnX7rbMsdW6z8K3z98ss6S2yLTz1LzKxzI0Ljg5oaPV4rj2wrfP37K7ysfLq7X3tcSho2Ipz+DNrLXjtcS8r7rPyc+1xNfutszLq7X3sdW6z8K3z9+ho7Oktsi089S8yscyNS41OKGjPC9wPgo8cD7V4srH0ru49svjtbzJz7XEy7y/vMziMTUtMaGjPC9wPgo8cD7K18/Ivau4+LP2tcS148XF0PKjrLnYvPzX1nijrNbY0MKx4LrFo6y009fz1sHT0jGjrDKjrDOjrKGto6xuoaM8L3A+CjxwPrao0uVwW2ldW2pdo6yx7cq+veG142m1vb3hteNq1q685LXEvuDA66GjPC9wPgo8cD62qNLlZFtpXVtqXaOsse3KvrTTacGstb0xo6zU2bTTMcGstb1qo6yjqNei0uKjrGk+aqOsx9KyosO709DP4MGsoaOjqTwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140526/20140526091425235.png" alt="\">
對於任意一個點i來說,有兩種連接方法,一種是如圖(a)所示,i與i-1相連,另一種呢是如圖(b),i與i-1不相連。
根據雙調旅程,我們知道結點n一定與n相連,那麼,如果我們求的d[n][n-1],只需將其加上p[n-1][n]就是最短雙調閉合路線。
根據上圖,很容易寫出方程式:
dp[i][j]=dp[i-1][j]+dist[i][i-1];
dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+dist[j][i]);
/************************************************************************* > File Name: hdu-4824-Disk_Schedule.cpp > Author: nealgavin > Mail: [email protected] > Created Time: Sun 25 May 2014 07:38:59 PM CST ************************************************************************/ #include#include #include using namespace std; const int mm = 1000+9; const int oo = 1e9; int dp[mm][mm],d[mm]; int n; int dis(int x,int y) { if(d[x] < d[y]) x^=y^=x^=y; int distance = d[x]-d[y]; return min(distance,360-distance); } void init() { dp[1][0] = dis(0,1); } int DP() { for(int i=2;i<=n;++i) { dp[i][i-1] = oo; for(int j=0;j