#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;
}
(DP)HDU 1158 Employment Planning
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.