按照LRJ的思路,f[i][j] 为第一个人走到第i个点 第二个人走到第j个点(i > j) 最少还需要走多少距离。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf 2e9
const int maxn = 1005;
struct node{
double x,y;
}a[maxn];
double f[maxn][maxn];
int n;
double dist(node s,node s1)
{
return sqrt(pow(s.x - s1.x,2) + pow(s.y - s1.y,2));
}
int main()
{
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
f[i][j] = inf;
for(int i = 1;i <= n;++i)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(int j = 1;j <= n - 2;++j)
f[n - 1][j] = dist(a[j],a[n]) + dist(a[n - 1],a[n]);
for(int i = n - 2;i >= 1;--i)
for(int j = 1;j <= i;++j)
f[i][j] = min(f[i + 1][j] + dist(a[i + 1],a[i]),f[i + 1][i] + dist(a[j],a[i + 1]));
printf("%.2lf\n",f[2][1] + dist(a[1],a[2]));
}
return 0;
}