dp[j]=min(dp[j],dp[j-i]+sum[i]);
dp[j-i]+sum[i]表示j头牛的时候少载i头+i头单独载的时间
#include <iostream>
#include <cstring>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <cstdio>
#include <stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
inline ll read()
{
ll k = 0, f = 1; char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
k = k * 10 + ch - '0';
ch = getchar();
}
return k * f;
}
#define inf 0x3f3f3f3f
ll sum[2505];
ll dp[2505];
int main()
{
ll n=read(),m=read();
for(int i=1;i<=n;i++)
{
ll t=read();
sum[i]=sum[i-1]+t;
dp[i]=inf;
}
for(int i=1;i<=n;i++)
{
sum[i]+=2*m;
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dp[j]=min(dp[j],dp[j-i]+sum[i]);
}
}
cout<<dp[n]-m<<'\n';
}