简单DP,最开始自己没有按照人数来想转移方程,还是要coding
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#define MAX 10009
#define INF 0xfffffff
using namespace std;
/*
dp[i][j] = max(dp[i-1][k]+cost,g[i-1]<=k<=MAXN)
前i个月雇佣j个人所用的价值其中cost为从状态dp[i-1][k]转移到dp[i][j]所需额外花费,
g[i]表示第i个月所需最少的工人数,maxN表示所有月所需最大的工人数
*/
int dp[15][1009];
int g[MAX];
int n;
int h,u,f;
int _max;
void solve_dp()
{
// cout<<_max<<endl;
int i,j,_min,temp;
for(int i = g[1];i<=_max;i++)
dp[1][i] = (h + u)*i;
for(int i = 2;i<=n;i++)
{
for(int j = g[i];j<=_max;j++)
{
temp = INF;
for(int k = g[i-1];k<=_max;k++)
{
if(k>j)
{
temp = min(temp,dp[i-1][k] + (k - j)*f + u*j);
}
else
{
temp = min(temp,dp[i-1][k] + (j - k)*h + u*j);
}
}
dp[i][j] = temp;
//cout<<dp[i][j]<<endl;
}
}
int _Min = INF;
for(int j = g[n];j<=_max;j++)
{
_Min = min(_Min,dp[n][j]);
}
cout<<_Min<<endl;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
_max = -INF;
scanf("%d%d%d",&h,&u,&f);
for(int i = 1;i<=n;i++)
{
scanf("%d",&g[i]);
_max = max(_max,g[i]);
}
solve_dp();
}
return 0;
}