hdu 1158
来源:互联网 发布:mac cad中文版下载 编辑:程序博客网 时间:2024/06/02 02:08
/* dp[i][j]表示前i个月且第i个月有j个工人支出的最少钱数(need[i]<=j<=max_need) 转移方程f[i][j]=min(f[i-1][k]+cost);(need[i-1]<=k<=max_need) cost= j*salary+(k-j)*fire(k>=j) j*salary+(j-k)*hire(k<j) ans=min(f[n][i])(need[n]<=i<=max_need),人数大于等于need[n] */#include<stdio.h>#include<string.h>#define inf 9999999int min(int x,int y){ if(x<y) return x; return y;}int dp[13][10000],works[10000];int main(){ int n,maxwork,cost; int hire,salary,fire; while(scanf("%d",&n)!=EOF) { if(n==0) break; scanf("%d%d%d",&hire,&salary,&fire); maxwork=0; for(int i=1;i<=n;i++) { scanf("%d",&works[i]); if(works[i]>maxwork) maxwork=works[i]; } for(int i=1;i<=maxwork;i++) { dp[1][i]=i*hire+i*salary; } for(int i=2;i<=n;i++) { for(int j=works[i];j<=maxwork;j++) { dp[i][j]=inf; for(int k=works[i-1];k<=maxwork;k++) { if(k<=j) cost=j*salary + (j-k)*hire; else cost=j*salary + (k-j)*fire; dp[i][j]=min(dp[i][j],dp[i-1][k]+cost); } } } int max=inf; for(int j=works[n];j<=maxwork;j++) if(dp[n][j]<max) max=dp[n][j]; printf("%d\n",max); } return 0; }