区间类型动态规划

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;
}

  

猜你喜欢

转载自www.cnblogs.com/shirlybaby/p/12296267.html
今日推荐