rt,时间复杂度 O(n3k)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e4+5;
int n,k,S,ans=1e18,sum[maxn],d[maxn],c[maxn],s[maxn],w[maxn],dp[maxn][105];
signed main(){
scanf("%lld%lld",&n,&k);
for(int i=2;i<=n;++i)
scanf("%lld",&d[i]);
for(int i=1;i<=n;++i)
scanf("%lld",&c[i]);
for(int i=1;i<=n;++i)
scanf("%lld",&s[i]);
for(int i=1;i<=n;++i)
scanf("%lld",&w[i]),S+=w[i];
memset(dp,0x3f,sizeof(dp));
d[0]=-1e18;
dp[0][0]=0;
for(int i=1;i<=n;++i)
dp[i][0]=dp[i-1][0]+w[i];
for(int j=1;j<=k;++j)
for(int i=1;i<=n;++i)
for(int k=0;k<i;++k){
int S=0;
for(int l=k;l<=i;++l)
if(min(d[l]-d[k],d[i]-d[l])>s[l])
S+=w[l];
dp[i][j]=min(dp[i][j],dp[k][j-1]+S+c[i]);
}
ans=S;
for(int i=1;i<=n;++i)
for(int j=1;j<=k;++j){
int S=0;
for(int k=i+1;k<=n;++k)
if(d[k]-d[i]>s[k])
S+=w[i];
ans=min(ans,dp[i][j]+S);
}
printf("%lld\n",ans);
return 0;
}