雇佣工人,每个工人每个月有一定的工资,雇佣和解雇都要花费一定的钱
每个月规定了至少要多少工人,求一年最少的花费
状态转移方程
dp[i][j]=min(dp[i][j],dp[i-1][k]+trans(k,j)+j*salary);
表示第i个月雇佣j个工人需要的最少钱数,trans(k,j)表示从k个人变成j个月的花费
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=10005;
int dp[13][maxn];
int hire,salary,fire,month,num[13],max_num,n;
int trans(int pre,int cur)
{
if(pre<cur)return (cur-pre)*hire;
else return (pre-cur)*fire;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n){
memset(dp,0x3f3f3f3f,sizeof(dp));
max_num=-1;
scanf("%d%d%d",&hire,&salary,&fire);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
max_num=max(max_num,num[i]);
}
for(int i=num[1];i<=max_num;i++)dp[1][i]=i*hire+i*salary;
for(int i=2;i<=n;i++){
for(int j=num[i];j<=max_num;j++){
for(int k=num[i-1];k<=max_num;k++){
dp[i][j]=min(dp[i][j],dp[i-1][k]+trans(k,j)+j*salary);
}
}
}
int ans=INF;
for(int i=num[n];i<=max_num;i++)ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}