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;    }

原创粉丝点击