題目描述
給定平面上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)
ans=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...