1、合并石子
2、凸包的路径
这道题将环形的信息转化为了长度为2倍的链,就变成了线性的问题
而且这道题。。。我觉得我不是很懂
CF838E Convex Countour
按顺时针给出一个凸多边形,任意两点间有一条直线边,求每个点恰好一次的最长不自交(和之前线段相交)路径
题解:https://www.luogu.com.cn/problemnew/solution/CF838E
//https://www.luogu.com.cn/problemnew/solution/CF838E #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int N=2510; struct Point { double x, y; Point(int x=0, int y=0):x(x), y(y){} } p[N]; double dis(Point a, Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double f[N][N][2]; int n; int main() { scanf("%d", &n); for (int i=0; i<n; i++) { int x, y; scanf("%d%d", &x, &y); p[i]=Point(x, y); } for (int len=2; len<=n; len++) for (int l=0; l<n; l++) { int r=(l+len-1)%n; f[l][r][0]=max(f[(l+1)%n][r][0]+dis(p[l], p[(l+1)%n]), f[(l+1)%n][r][1]+dis(p[l], p[r])); f[l][r][1]=max(f[l][(r-1+n)%n][0]+dis(p[r], p[l]), f[l][(r-1+n)%n][1]+dis(p[r], p[(r-1+n)%n])); } double ans=0; for (int i=0; i<n; i++) ans=max(ans, max(f[i][(i+n-1)%n][0], f[i][(i+n-1)%n][1])); printf("%.10lf", ans); return 0; }