雙調歐幾里得旅行商問題解法 POJ 2677

2021-09-06 06:05:24 字數 2236 閱讀 1333

對於這個解法,網上題解一大堆。不過覺得還是算導官方給的解答好些,簡潔又清楚。。。

大概總結一下(不是翻譯)=.=

首先是排序。

然後確定狀態 f[i][j] (i >= j, i == j表示的只有n這個點) 表示 從i到1嚴格從右往左走然後再從1嚴格從左往右走到j 這樣兩條路徑的最小值,當然[1, max(i, j)]區間上所有的點都是被訪問過得。

存在兩種狀態 :

1:  j < i - 1;

dp[i][j] = dp[i-1][j] + dis(i, i - 1);

2: j == i - 1;

dp[i][j] = min  //這個dp[j][k]本來應該是dp[k][j]的,但是由於dp[x][y] = dp[y][x]所以用dp[j][k]表示更方便,因為dp[i][j]滿足i > j, dp[j][k]也滿足j > k。 

poj 2677&&hdu 2224**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include

9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16

17#define cl(arr, val) memset(arr, val, sizeof(arr))

18#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

19#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

20#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

21#define l(x) (x) << 1

22#define r(x) (x) << 1 | 1

23#define mid(l, r) (l + r) >> 1

24#define min(x, y) x < y ? x : y

25#define max(x, y) x < y ? y : x

26#define e(x) (1 << (x))

27#define iabs(x) (x) < 0 ? -(x) : (x)

28#define out(x) printf("%i64d\n", x)

29#define lowbit(x) (x)&(-x)

30#define read() freopen("data.in", "r", stdin)

31#define write() fropen("data.out", "w", stdout);

3233

const

int eps = 1e-8

;34 typedef long

long

ll;35

const

double inf =1e15;

3637

using

namespace

std;

3839

const

int n = 1024;40

41double

f[n][n];

42double

dis[n][n];

4344

struct

node

50}p[n];

5152

double dis(int i, int

j) 55

56int

main() 67}

68 f[2][1] = dis[2][1

];69

//i >= j

70for(i = 3; i <= n; ++i) 79}

8081

if(n == 2) ans = f[2][1

];82

else ans = f[n][n-1] + dis[n][n-1

];83 printf("

%.2f\n

", ans);84}

85return0;

86 }

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

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

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

題目描述 給定平面上n個點作為輸入,要求從最左端的點開始,嚴格向右前進,直到最右端的點,再嚴格向左前進到第乙個點,每乙個點只能經過一次。主演算法 d i,j 表示兩個人第乙個點出發沿著不同的路徑分別走到i,j 並且經過1 max i,j 的所有點到達終點還需要的距離。di st i j 表示i,j ...

雙調旅行商問題

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