用的是和关路灯一样的思路,统计总花费
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n;
double x0;
double f[N][N][2],ss[N];
struct dd
{
double x,y,v;
}p[N];
bool cmp(const dd&a,const dd&b)
{
return a.x<b.x;
}
int main()
{
scanf("%d%d",&n,&x0);
for(int i=1;i<=n;i++)
cin>>p[i].x;
for(int i=1;i<=n;i++)
cin>>p[i].y;
for(int i=1;i<=n;i++)
cin>>p[i].v;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
ss[i]=ss[i-1]+(p[i].v)/1000.000;
for(int i=1;i<=n;i++)
f[i][i][0]=f[i][i][1]=abs(x0-p[i].x)*ss[n];
for(int i=2;i<=n;i++)
for(int j=1;j+i-1<=n;j++)
{
int r=j+i-1;
f[j][r][0]=min(f[j+1][r][0]+abs(p[j].x-p[j+1].x)*(ss[n]-ss[r]+ss[j]),f[j+1][r][1]+abs(p[r].x-p[j].x)*(ss[n]-ss[r]+ss[j]));
f[j][r][1]=min(f[j][r-1][0]+abs(p[j].x-p[r].x)*(ss[n]-ss[r-1]+ss[j-1]),f[j][r-1][1]+abs(p[r].x-p[r-1].x)*(ss[n]-ss[r-1]+ss[j-1]));
}
double ans=0.00;
for(int i=1;i<=n;i++)
ans+=p[i].y/1000.000;
printf("%0.3f",ans-min(f[1][n][0],f[1][n][1]));
}