代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <limits.h>
#include <cstring>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> PII;
const int INF = 0x3f3f3f3f, INF_BIT = 0x3f;
const int N = 1010;
LL n, c;
struct Node{
LL x, h, v;
};
Node a[N];
LL d[N][N][2];
LL tm[N][N][2];
int main(){
scanf("%lld%lld", &n, &c);
for(LL i = 1;i <= n;i++){
scanf("%lld", &a[i].x);
}
for(LL i = 1;i <= n;i++){
scanf("%lld", &a[i].h);
}
for(LL i = 1;i <= n;i++){
scanf("%lld", &a[i].v);
}
a[++n] = {c, 0, 0};
sort(a + 1, a + n + 1, [](Node a, Node b){return a.x < b.x;});
for(LL l = 1;l <= n;l++)
for(LL r = l;r <= n;r++)
d[l][r][0] = d[l][r][1] = -(2e11 + 1);
LL ind = -1;
for(LL i = 1;i <= n;i++)
if(a[i].x == c && a[i].h == 0 && a[i].v == 0){
ind = i;
break;
}
d[ind][ind][0] = d[ind][ind][1] = 0;
for(LL len = 2;len <= n;len++){
for(LL l = 1;l + len - 1 <= n;l++){
LL r = l + len - 1;
LL q1, q2;
q1 = d[l + 1][r][0] + (a[l].h - a[l].v * (tm[l + 1][r][0] + a[l + 1].x - a[l].x));
q2 = d[l + 1][r][1] + (a[l].h - a[l].v * (tm[l + 1][r][1] + a[r].x - a[l].x));
d[l][r][0] = max(q1, q2);
if(q1 > q2) tm[l][r][0] = tm[l + 1][r][0] + a[l + 1].x - a[l].x;
else if(q1 < q2) tm[l][r][0] = tm[l + 1][r][1] + a[r].x - a[l].x;
else tm[l][r][0] = min(tm[l + 1][r][0] + a[l + 1].x - a[l].x, tm[l + 1][r][1] + a[r].x - a[l].x);
q1 = d[l][r - 1][1] + (a[r].h - a[r].v * (tm[l][r - 1][1] + a[r].x - a[r - 1].x));
q2 = d[l][r - 1][0] + (a[r].h - a[r].v * (tm[l][r - 1][0] + a[r].x - a[l].x));
d[l][r][1] = max(q1, q2);
if(q1 > q2) tm[l][r][1] = tm[l][r - 1][1] + a[r].x - a[r - 1].x;
else if(q1 < q2) tm[l][r][1] = tm[l][r - 1][0] + a[r].x - a[l].x;
else tm[l][r][1] = min(tm[l][r - 1][1] + a[r].x - a[r - 1].x, tm[l][r - 1][0] + a[r].x - a[l].x);
}
}
LL ans = max(d[1][n][0], d[1][n][1]);
printf("%.3lf\n", ans / 1000.0);
return 0;
}
部分变量意思解释:dl,r,k (k∈{0,1}) 的含义是获得了 [l,r] 内的所有彩蛋,如果 k=0,那么表示现在在 l 处,否则表示现在在 r 处,能获得的最大魅力值之和;tml,r,k (k∈{0,1}) 的含义是获得了 [l,r] 内的所有彩蛋,如果 k=0,那么表示现在在 l 处,否则表示现在在 r 处,在获得了最大魅力值之和的前提下,最小的时间之和