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 }