雙調歐幾里得旅行商問題 《演算法導論》

2021-07-16 19:59:14 字數 1356 閱讀 4589

題目描述

給定平面上n個點作為輸入,要求從最左端的點開始,嚴格向右前進,直到最右端的點,再嚴格向左前進到第乙個點,每乙個點只能經過一次。

主演算法:d(

i,j)

表示兩個人第乙個點出發沿著不同的路徑分別走到i,

j 並且經過1∼

max(

i,j)

的所有點到達終點還需要的距離。di

st(i

,j) 表示i,

j 的歐幾里得距離。

因此,d(i

,j)=

d(j,

i),不妨設

i>

j ,一步一步「蠶食」所有的點,則下一步的決策無非是,第乙個人走到i+

1 ,或者第二個人走到i+

1 個點,所以

d(

i,j)

=min

(d(i

+1,j

)+di

st(i

,i+1

),d(

i+1,

i)+d

ist(

j,i+

1))

邊界情況

d(

n−1,

j)=d

ist(

n−1,

n)+d

ist(

j,n)

所以

an

s=d(

2,1)

+dis

t(2,

1)給出主**

double dp(int i,int j)

else

return ans;

}}

題目鏈結

ac**

#include

#include

#include

#include

#define maxn 1009

#include

using namespace std;

double d[maxn][maxn];

int c[maxn][2];

int n;

double dist(int i,int j)

double dp(int i,int j)

else

return ans;}}

int main()

return 0;

}

演算法導論 15 1 雙調歐幾里得旅行商問題

先做以下定義 對所有點按x座標排序,從0開始依次為每個點編號,令 1 兩條路徑分別為a和b,且起點都是點0,方向嚴格向右 2 a i 表示路徑a的一種狀態,起點為點0,終點為點i,方向嚴格向右,0 i 3 b j 表示路徑b的一種狀態,起點為點0,終點為點i,方向嚴格向右,0 j 4 d i j 為...

演算法筆記 雙調歐幾里得旅行商問題

reference 1 演算法導論 15 3 2 將所有點按x座標從小到大排序後 假設不存在重複 從左至右標記為0,1,2 n 1 那麼這問題的關鍵乙個性質是,對於一點i i 0 和任意包含它的雙調路徑,i 1一定是i的前繼或者後繼。如果我們假設乙個環遊的順序,比如逆時針 f i j i j 表示從...

雙調旅行商問題

poj2677,先對x排序,但這題已經排好序的了 dp i j 表示從點i開始往左直到最左邊的點,然後再從左往右到j點且經過所有i左邊的點所走的距離 include include include include using namespace std define ll long long def...