传送门:http://codeforces.com/gym/100812/problem/I
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
LL a[1005], sum[1005], dp[1005];
int main() {
int n;
LL d, c;
// freopen("in.txt","r",stdin);
while(~scanf("%d%I64d%I64d", &n, &d, &c)) {
for(int i = 1; i <= n; i++) {
scanf("%I64d", &a[i]);
sum[i] = sum[i - 1] + a[i]; //前i个送货时间的前缀和
}
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
//区间dp,送到第i个货物时,考虑第i个与前i-1个货物的组合,取花费最小的组合
//由于前前i-1个货物的情况已经是最优,那么dp[i]=min(dp[j]+cost);(cost是j+1,i]一起送时候的花费)
//对于[j+1,i]中每个物品x,其花费cost=(a[i]-a[x])*c,那么累加起来等于((i-j)*a[i]-(sum[i]-sum[j]))*c
for(int i = 1; i <= n; i++) {
for(int j = 0; j < i; j++) {
dp[i] = min(dp[i], dp[j] + ((i - j) * a[i] - (sum[i] - sum[j])) * c + d);
}
// printf("%I64d%c",dp[i],i==n?'\n':' ');
}
printf("%I64d\n", dp[n]);
}
return 0;
}