题目很容易理解,就不说了!
/*
简单DP,转移方程:dp[i][j] = min(dp[i-1][k]+cost);
第i个月,雇佣人数为j时的最小花费 k 为 上一个月 最小人数 到 最大人数
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 0x7fffffff
#define N 1000
int g[N];
int dp[12][N];
int n,hire,salay,fire,max;
void solve()
{
int i,j,k,min,tmp;
for(i=g[0];i<=max;i++) //初始化
dp[0][i] = (hire + salay) * i;
for(i=1;i<12;i++){
for(j=g[i];j<=max;j++){
min = INF;
for(k=g[i-1];k<=max;k++){
if(k>j){
tmp = dp[i-1][k] + fire*(k-j) + salay*j;
}
else tmp = dp[i-1][k] + hire*(j-k) + salay*j;
if(tmp < min)min = tmp;
}
dp[i][j] = min;
}
}
min = INF;
for(i=g[n-1];i<=max;i++)
if(dp[n-1][i] < min)
min = dp[n-1][i];
printf("%d\n",min);
}
int main()
{
int i;
while(scanf("%d",&n),n){
scanf("%d%d%d",&hire,&salay,&fire);
max = 0;
for(i=0;i<n;i++){
scanf("%d",&g[i]);
if(g[i]>max)max = g[i];
}
solve();
}
return 0;
}