#include<iostream>
#include<cstdio>
#define INF 10000000
using namespace std;
int worker[100005];
int dp[13][100005];
int main()
{
int n;
int i,j,k;
while(scanf("%d",&n)!=EOF&&n)
{
int hire,salary,fire; //招聘所需资金,工资,解雇所需资金
scanf("%d%d%d",&hire,&salary,&fire);
int max=0;
for(i=1;i<=n;i++)
{
scanf("%d",&worker[i]);
max=max>worker[i]?max:worker[i]; //找出所需人数最多的人数
}
for(i=worker[1];i<=max;i++)
{
dp[1][i]=i*(hire+salary); //初始化第一个月从最少人数到最多人数所需的工资
}
int min;
for(i=2;i<=n;i++) //从第二个月开始
{
for(j=worker[i];j<=max;j++) //从第i个月所需要最少人数到最多人数
{
min=INF;
for(k=worker[i-1];k<=max;k++) //上一个月所需最少人数到最多人数
{
/*如果前一个月的人数多于本月所需的人数,那么就要开除多余的人数*/
if(k>j) min=min<dp[i-1][k]+(k-j)*fire+j*salary?min:dp[i-1][k]+(k-j)*fire+j*salary;
/*如果前一个月的人数少于本月所需的人数,那么就要招进少于的人数*/
else min=min<dp[i-1][k]+(j-k)*hire+j*salary?min:dp[i-1][k]+(j-k)*hire+j*salary;
}
dp[i][j]=min;
}
}
min=INF;
/*遍历第n个月从所需最少人数到最多的人数*/
for(i=worker[n];i<=max;i++)
min=min<dp[n][i]?min:dp[n][i];
printf("%d\n",min);
}
return 0;
}