hdu1158 Employment Planning

来源:互联网 发布:怎么在淘宝买发票 编辑:程序博客网 时间:2024/06/04 18:33

DP[I][J] 表示第i个月j个人的花费。由题目可以得到n个月需要人数最多的那个月人数为多少。枚举每个月最少需要多少人 到 最多的人数。感觉有点像背包,第一个月比较特殊,只能雇佣人。处理出来第一个月j个人所需要的花费。从第二个月开始枚举

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define INF 99999999int const MAXN = 110;int dp[MAXN][MAXN],num[MAXN];inline int Min(int a,int b){    return a<b?a:b;}inline int Max(int a,int b){    return a>b?a:b;}int main(){    int n;    while(~scanf("%d",&n),n){        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        int m = 0;        for(int i = 1;i <= n;i++){            scanf("%d",&num[i]);            m = Max(num[i],m);        }        for(int i = 1;i <= m;i++){            dp[1][i] = (a + b) * i;        }        for(int i = 2;i <= n;i++){            for(int j = num[i];j <= m;j++){                int sum = INF;                for(int k = num[i - 1];k <= m;k++){                    int s;                    if(k > j) s = dp[i - 1][k] + (k - j) * c + b * j;                    else s = dp[i - 1][k] + (j - k) * a + b * j;                    sum = Min(s,sum);                }                dp[i][j] = sum;            }        }        int sum = INF;        for(int i = num[n];i <= m;i++){            sum = Min(sum,dp[n][i]);        }        printf("%d\n",sum);    }    return 0;}



0 0