对于每一个点,都可以选择跳过。
如果跳过点$i$,那么它减少的距离就是$dist(i-1, i) + dist(i, i+1) - dist(i-1, i+1)$。
求出最大的这个值,用原来的总路径减去它即可。
#include <bits/stdc++.h>
using namespace std;
int x[100010], y[100010];
int m(int a, int b) { return abs(x[a] - x[b]) + abs(y[a] - y[b]); }
int n, res, p;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
for (int i = 2; i <= n; i++) res += m(i - 1, i); //总路径
for (int i = 2; i < n; i++) p = max(p, m(i - 1, i) + m(i, i + 1) - m(i - 1, i + 1)); //跳过第i个点的最大减少路径
printf("%d\n", res - p);
return 0;
}
跟我写的差不多