hdu 1158 Employment Planning

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1158

动态规划(表示我的dp好弱,挽尊~~~)

dp[i][j]表示第i个月雇佣j人的最小代价。其中j大于等于当月需求人数,小于等于这几个月中需求最大的那个月的人数。

状态转移方程: dp[i][j]=min(dp[i-1][k]+当月代价,dp[i][j])   k大于等于i-1月需求人数,小于等于这几个月中需求最大的那个月的人数。

源代码:

 1 #include <iostream>
 2 #include<stdio.h>
 3 #define INF 100000000
 4 using namespace std;
 5 int dp[13][10000];//第几个月雇佣几个人的最小代价
 6 int people[13];
 7 int main()
 8 {
 9    int n,hire,salary,fire;
10    while(scanf("%d",&n)){
11        if(n==0) break;
12      scanf("%d %d %d",&hire,&salary,&fire);
13      int maxi=-1*INF;
14      int mini=INF;
15      int ans=INF;
16      for(int i=1;i<=n;i++){
17        scanf("%d",&people[i]);
18        if(people[i]>maxi) maxi=people[i];
19        if(people[i]<mini) mini=people[i];
20      }
21      for(int i=0;i<=n;i++)
22        for(int j=0;j<=maxi;j++)
23           dp[i][j]=INF;
24          dp[0][0]=0;
25     people[0]=0; //表示第0个月雇佣0人
26      for(int i=1;i<=n;i++)
27        for(int j=people[i];j<=maxi;j++)
28          for(int k=people[i-1];k<=maxi;k++){
29            if(k>j)
30              dp[i][j]=min(dp[i-1][k]+(k-j)*fire+j*salary,dp[i][j]);
31              else{
32              dp[i][j]=min(dp[i-1][k]+(j-k)*hire+j*salary,dp[i][j]);
33             }
34          }
35        for(int i=people[n];i<=maxi;i++)
36            if(dp[n][i]<ans)
37              ans=dp[n][i];
38       printf("%d\n",ans);
39    }
40     return 0;
41 }

 

posted @ 2013-08-15 18:01  小の泽  阅读(178)  评论(0编辑  收藏  举报