这个题只有九十分
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int n,_x;
struct node{
int x,y,v;
}a[N+5];
int sum[N+5];
int dp[N+5][N+5][2];
double ans=0;
int cal(int l,int r,int time)
{
return (sum[l-1]+sum[n]-sum[r])*time;
}
bool cmp(node a,node b)
{
return a.x<b.x;
}
signed main()
{
cin>>n>>_x;
memset(dp,0x3f,sizeof dp );
a[n+1]={_x,0,0};
for(int i=1;i<=n;i++)
{
cin>>a[i].x;
if(a[i].x==_x) s=0;
}
for(int i=1;i<=n;i++)
{
cin>>a[i].y;
}
for(int i=1;i<=n;i++)
{
cin>>a[i].v;
}
n++;
stable_sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].x==_x)
{
dp[i][i][0]=dp[i][i][1]=0;
}
sum[i]=sum[i-1]+a[i].v;
ans+=a[i].y;
}
for(int len=2;len<=n;len++)
{
for(int l=1;l<=n-len+1;l++)
{
int r=l+len-1;
dp[l][r][0]=min(dp[l+1][r][0]+cal(l+1,r,a[l+1].x-a[l].x),dp[l+1][r][1]+cal(l+1,r,a[r].x-a[l].x));
dp[l][r][1]=min(dp[l][r-1][0]+cal(l,r-1,a[r].x-a[l].x),dp[l][r-1][1]+cal(l,r-1,a[r].x-a[r-1].x));
}
}
printf("%.3lf",(ans-min(dp[1][n][0],dp[1][n][1]))/1000.0);
return 0;
}