DP[I][J] 表示第i个月j个人的花费。由题目可以得到n个月需要人数最多的那个月人数为多少。枚举每个月最少需要多少人 到 最多的人数。感觉有点像背包,第一个月比较特殊,只能雇佣人。处理出来第一个月j个人所需要的花费。从第二个月开始枚举
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 99999999
int const MAXN = 110;
int dp[MAXN][MAXN],num[MAXN];
inline int Min(int a,int b){
return a<b?a:b;
}
inline int Max(int a,int b){
return a>b?a:b;
}
int main(){
int n;
while(~scanf("%d",&n),n){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int m = 0;
for(int i = 1;i <= n;i++){
scanf("%d",&num[i]);
m = Max(num[i],m);
}
for(int i = 1;i <= m;i++){
dp[1][i] = (a + b) * i;
}
for(int i = 2;i <= n;i++){
for(int j = num[i];j <= m;j++){
int sum = INF;
for(int k = num[i - 1];k <= m;k++){
int s;
if(k > j) s = dp[i - 1][k] + (k - j) * c + b * j;
else s = dp[i - 1][k] + (j - k) * a + b * j;
sum = Min(s,sum);
}
dp[i][j] = sum;
}
}
int sum = INF;
for(int i = num[n];i <= m;i++){
sum = Min(sum,dp[n][i]);
}
printf("%d\n",sum);
}
return 0;
}