#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
struct NODE{
long long v,w,r;
}node[75];
long long sum[75];long long dp[75][75][75];
bool vcmp(NODE x,NODE y)
{
return x.v<=y.v;
}
bool wcmp(NODE x,NODE y)
{
return x.w<=y.w;
}
int main()
{
int n,K;
int i,j,k,o;
int l,t;
scanf("%d %d",&n,&K);
for(i=1;i<n+1;++i)
scanf("%lld",&node[i].v);
for(i=1;i<n+1;++i)
scanf("%lld",&node[i].w);
for(i=1;i<n+1;++i)
scanf("%lld",&node[i].r);
sort(node+1,node+n+1,wcmp);
for(i=1;i<n+1;++i)
node[i].w=i;
sort(node+1,node+n+1,vcmp);
for(i=1;i<n+1;++i)
sum[i]=sum[i-1]+node[i].r;
memset(dp,0x3f,sizeof(dp));
for(i=1;i<n+2;++i)
for(j=1;j<n+1;++j)
dp[i][i-1][j]=0;
for(l=0;l<n;++l)
for(i=1;i<n-l+1;++i)
{
j=i+l;
for(k=1;k<n+1;++k)
for(o=i;o<j+1;++o)
{
t=dp[i][o-1][k]+dp[o+1][j][k]+K+sum[j]-sum[i-1];
if(t<dp[i][j][k])
dp[i][j][k]=t;
if(node[o].w>=k)
{
t=dp[i][o-1][node[o].w]+dp[o+1][j][node[o].w]+sum[j]-sum[i-1];
if(t<dp[i][j][k])
dp[i][j][k]=t;
}
}
}
printf("%lld",dp[1][n][1]);
return 0;
}
保持中序遍历结果不变同时通过权值改变树的形态可以获得一个唯一状态。