题目链接:UVA - 1347 Tour
#include <bits/stdc++.h>
using namespace std;
struct node
{
double x, y;
}a[1005];
double dis(int i, int j)
{
return sqrt((a[i].x - a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y));
}
double dp[1005][1005];
double fin(int i, int j)
{
if(dp[i][j] > 0)return dp[i][j];
return dp[i][j] = min(fin(i + 1, j) + dis(i, i + 1), fin(i + 1, i) + dis(j, i + 1));
}
int main()
{
std::ios::sync_with_stdio(0);
int n, i, j, k;
while(scanf("%d", &n) != EOF)
{
for(i = 1; i <= n; i++)scanf("%lf %lf", &a[i].x, &a[i].y);
for(i = 0; i <= n; i++)
for(j = 0; j <= n; j++)dp[i][j] = 0;
for(i = 1; i < n - 1; i++)
dp[n - 1][i] = dis(n - 1, n) + dis(i, n);
double ans = fin(1, 1);
printf("%.2lf\n", ans);
}
return 0;
}