WA on #7。悲。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n; long long dp[1000007][2];
//dp[i][1/0]表示 1 - i-1 的房间已经clear
//dp[i][1]表示第i个房间的boss剩一格血,等会再回来打。
//dp[i][0]表示第i个房间的boss已经GG。
long long a[1000007], r1, r2, r3, d;
int main() {
scanf("%d%lld%lld%lld%lld", &n, &r1, &r2, &r3, &d);
for(int i=1; i<=n; i++) scanf("%lld", &a[i]);
dp[1][1] = min(r1*a[1]+r1, r2);
dp[1][0] = r1*a[1]+r3;
for(int i=2; i<n; i++) {
dp[i][1] = dp[i-1][0] + d + min(r1*a[i]+r1, r2);
long long aa = dp[i-1][1] + d + min(r1*a[i]+r1, r2) + r1 + d + r1 + d;
//aa表示,i房间的boss先用手枪或者激光枪打到残血
//然后去i-1房间打残血boss,再回到i房间打死boss。
long long bb = dp[i-1][0] + d + r1*a[i] + r3;
long long cc = dp[i-1][1] + d + r1*a[i] + r3 + d + r1 + d;
//cc表示,第i个房间的boss直接用AWP打死,然后去i-1房间打残血boss,然后再回来。
dp[i][0] = min(aa, bb);
dp[i][0] = min(cc, dp[i][0]);
}
if(n>1) {
long long aa = dp[n-1][1] + d + min(r1*a[n]+r1, r2) + d + r1 + d + r1;
long long bb = dp[n-1][0] + d + r1*a[n] + r3;
long long cc = dp[n-1][1] + d + r1*a[n] + r3 + d + r1;
//cc表示游戏结束在n-1房间。
dp[n][0] = min(aa, bb);
dp[n][0] = min(cc, dp[n][0]);
}
cout<<dp[n][0]<<endl;
return 0;
}