Ural1143 - Electric Path
注意取模n
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#define INF (int)(1e9)
#define MAXN 8
using namespace std;
struct P {
double x, y;
}point[1010];
int n;
double dist (P b, P a) {
return sqrt((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y));
}
double dp[1010][1010][2];
double solve (int i, int L, int k) {
if (dp[i][L][k] > 0) return dp[i][L][k];
if (L == 1) return 0;
double res = 1e9;
if (k == 0) {
res = min(res, min(dist(point[i],point[(i+1)%n])+solve((i+1)%n,L-1,0)
, dist(point[i],point[(i+L-1)%n])+solve((i+1)%n,L-1,1)));
}
else {
res = min(res, min(dist(point[(i+L-1)%n],point[(i+L-2)%n])+solve(i,L-1,1)
, dist(point[(i+L-1)%n],point[i])+solve(i,L-1,0)));
}
return dp[i][L][k] = res;
}
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif // LOCAL
while (cin >> n) {
for (int i = 0; i < n; ++ i) {
cin >> point[i].x >> point[i].y;
}
for (int i = 0; i < n; ++ i) {
for (int j = 1; j <= n; ++ j)
dp[i][j][0] = dp[i][j][1] = -1.0;
}
double res = 1e9;
for (int i = 0; i < n; ++ i) {
res = min(res, min(solve(i,n,0),solve(i,n,1)));
}
printf("%.3f\n", res);
}
}