題意:給你 n 個二維座標上的點,你需要經過所有的點然後走回原地,求最短路徑。
思路:我們先給所有的點按照 x 座標公升序排列, 因為要走成環我們可以看成兩個人同時從第乙個點開始走, 定義 dp[i][k] 表示第乙個人走到第 i 個點第二個人走到第 k 個點的最短距離(走在前面的人是 i )。
對於任意乙個點i來說,有兩種連線方法,i 與 i-1相連或者 i 與 i-1 前面的點 k 相連。
轉移方程就是:
d[i][k] = d[i-1][k] + len[i][i-1];
d[i][i-1] = min(d[i][i-1], d[i-1][k] + len[k][i]);
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 205;
struct point
};int n;
point pnt[maxn];
double dp[maxn][maxn];
double length(point a, point b)
int main()
sort(pnt, pnt+n);
memset(dp, 127, sizeof(dp));
dp[0][0] = 0;
for(int i = 1; i < n; i++)
}printf("%.2f\n", dp[n-1][n-2] + length(pnt[n-2], pnt[n-1]));
}return
0;}
UVA 1347 Tour 雙調旅行商
題意 平面上有n個點。乙個人要從左上角的點向右走,到右下角的點,然後再回到左上角的點。現在想讓這個人每個點到達一次,且走的總路程的距離最小。求出最小的距離。思路 雙調旅行商問題。因為起點和中途點已知,我們可以把這個問題轉化成兩個人從左上角出發,分別不重複的到達其他點,最後在右下角的點匯合。可以注意到...
POJ2677 Tour(DP 雙調巡遊)
題意 演算法導論上的一道習題,給出一系列點的的座標,現在從最左端出發,到達最右端的點,再返回原點,要求遍歷所有點並且路程最短。要點 出發又返回可以看成兩個人同時從左往右走,其中乙個人走的快乙個人走的慢。重點是因為乙個點只能走一次,所以可以想出最優子結構,假設現在用dp i j 表示兩個人分別走到點i...
雙調歐幾里得旅行商問題解法 POJ 2677
對於這個解法,網上題解一大堆。不過覺得還是算導官方給的解答好些,簡潔又清楚。大概總結一下 不是翻譯 首先是排序。然後確定狀態 f i j i j,i j表示的只有n這個點 表示 從i到1嚴格從右往左走然後再從1嚴格從左往右走到j 這樣兩條路徑的最小值,當然 1,max i,j 區間上所有的點都是被訪...