對於這個解法,網上題解一大堆。不過覺得還是算導官方給的解答好些,簡潔又清楚。。。
大概總結一下(不是翻譯)=.=
首先是排序。
然後確定狀態 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 #include8 #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...