O(n2h2)dp代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e3+10;
#define F(i,k,n) for (int i=k;i<=n;i++)
int dp[N][N];
int t[N];
int sum[N];
int f[N];
int d[N];
int n,h;
signed main(){
cin>>n>>h;
h*=12;
F(i,1,n) cin>>f[i];
F(i,1,n) cin>>d[i];
F(i,1,n-1){
cin>>t[i];
sum[i+1]=sum[i]+t[i];
}
int maxn=-1;
memset(dp,-0x3f,sizeof(dp));
F(i,1,n){
F(j,1,h){
int l=j-sum[i];
dp[i][j]=l*f[i]-(l*(l-1))/2*d[i];
F(k,1,i-1){
F(p,0,j-sum[i]+sum[k]){
int l=j-p-sum[i]+sum[k];
dp[i][j]=max(dp[i][j],dp[k][p]+l*f[i]-((l*(l-1))/2*d[i]));
}
}
maxn=max(maxn,dp[i][j]);
}
}
cout<<maxn;
return 0;
}