参考紫书。
假设有两个人,选择不同的点,那么到终点时,他们的路径和,就是答案。因为dp[i][j] = dp[j][i]。所以我们可以只考虑 i > j。dp[i][j] 由 dp[i + 1][i](dp[i][j] 下一步 j -> i + 1) 和 dp[i + 1][j]转移而来。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 100 + 5;
double dp[maxn][maxn], dist[maxn][maxn], x[maxn], y[maxn];
int main()
{
int n;
while(scanf("%d", &n) == 1)
{
for(int i = 0; i < n; i++)
scanf("%lf%lf", &x[i], &y[i]);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
dist[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
for(int i = n - 2; i >= 0; i--)
{
for(int j = 0; j < n; j++)
{
if(i == n - 2) dp[i][j] = dist[i][n - 1] + dist[j][n - 1];
else
{
dp[i][j] = min(dp[i + 1][j] + dist[i + 1][i], dp[i + 1][i] + dist[i + 1][j]);
}
}
}
printf("%.2lf\n", dp[0][0]);
}
return 0;
}