悬关。
好像除了最高的点正常输出编号外全都输出 0?
#include <bits/stdc++.h>
//#define cal(x) (((x) - 1) % n + 1)
#define int long long
using namespace std;
double x[2005], y[2005], f[2005][2005][2];
int ll[2005][2005][2], lr[2005][2005][2], li[2005][2005][2];
inline double dis(int a, int b)
{
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
int n;
inline int cal(int x)
{
return (x - 1) % n + 1;
}
signed main()
{
int mx = 0;
scanf("%lld", &n);
y[0] = -1e9;
for (int i = 1; i <= n; i++)
{
scanf("%lf %lf", &x[i], &y[i]);
x[i + n] = x[i], y[i + n] = y[i];
if (y[i] > y[mx])
mx = i;
}
for (int i = 1; i <= n * 2; i++)
for (int j = 1; j <= n * 2; j++)
f[i][j][0] = f[i][j][1] = 1e9;
f[mx][mx][0] = f[mx][mx][1] = f[mx + n][mx + n][0] = f[mx + n][mx + n][1] = 0;
double x, y;
for (int l = 2; l <= n; l++)
{
for (int i = 1, j = l; j <= n * 2; j++)
{
x = f[i + 1][j][0] + dis(i, i + 1), y = f[i + 1][j][1] + dis(i, j);
if (x < y)
f[i][j][0] = x, ll[i][j][0] = i + 1, lr[i][j][0] = j, li[i][j][0] = 0;
else
f[i][j][0] = y, ll[i][j][0] = i + 1, lr[i][j][0] = j, li[i][j][0] = 1;
x = f[i][j - 1][0] + dis(i, j), y = f[i][j - 1][1] + dis(j - 1, j);
if (x < y)
f[i][j][1] = x, ll[i][j][1] = i, lr[i][j][1] = j - 1, li[i][j][1] = 0;
else
f[i][j][1] = y, ll[i][j][1] = i, lr[i][j][1] = j - 1, li[i][j][1] = 1;
}
}
int ii, jj, ans = 1e9;
bool l = 0;
for (int i = 1; i <= n + 1; i++)
{
for (int j = 0; j <= 1; j++)
{
if (ans > f[i][i + n - 1][j])
{
ans = f[i][i + n - 1][j];
ii = i, jj = i + n - 1, l = j;
}
}
}
stack <int> st;
if (l)
st.push(cal(jj));
else
st.push(cal(ii));
for (int i = 1; i <= n - 2; i++)
{
int ni = ll[ii][jj][l], nj = lr[ii][jj][l], nl = li[ii][jj][l];
ii = ni, jj = nj, l = nl;
if (l)
st.push(cal(jj));
else
st.push(cal(ii));
}
printf("%lld ", mx);
while (!st.empty())
{
printf("%lld ", st.top());
st.pop();
}
return 0;
}