HDU 1158 Employment Planning(DP)
很不错的一个DP,结果让我糟蹋了。。想了半天把状态方程想出来,结果编程的时候,把一个1写成i了,在SCF和QC的帮助下查到了。。。真悲剧啊20+的提交。。。
题意:老板雇人有,招人费,工人工资,开除人的费用。给出第几个月需要几个人。问最少的花费。
二维DP。i代表月份,j代表在这个月的人数。所以这个月的情况跟上个月有关系,状态转移方程o[i][j] = min (o[i-1][k] +新的花费);
按说1打成了i,应该是很大的错误,怎么过的数据啊。。。。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 100000000 4 int p[13],o[13][100001]; 5 int main() 6 { 7 int i,j,k,min,n,x,y,z,max,sum,d,m; 8 while(scanf("%d",&n)!=EOF) 9 { 10 memset(o,0,sizeof(o)); 11 if(!n) break; 12 sum = 0; 13 scanf("%d%d%d",&x,&y,&z); 14 for(i = 1;i <= n;i ++) 15 { 16 scanf("%d",&p[i]); 17 if(i == 1) 18 { 19 min = p[1]; 20 max = p[1]; 21 } 22 else 23 { 24 if(max < p[i]) 25 max = p[i]; 26 if(min > p[i]) 27 min = p[i]; 28 } 29 } 30 sum += min*x+min*y*n; 31 for(i = 1;i <= n;i ++) 32 { 33 p[i] -= min; 34 } 35 d = max - min; 36 for(i = p[1];i <= d;i ++) 37 { 38 o[1][i] = (x+y)*i; 39 } 40 for(i = 2;i <= n;i ++) 41 for(j = p[i];j <= d;j ++) 42 { 43 min = N; 44 for(k = p[i-1];k <= d;k ++) 45 { 46 if(k > j) 47 m = j*y+(k-j)*z+o[i-1][k]; 48 else 49 m = j*y+(j-k)*x+o[i-1][k]; 50 if(min > m) 51 min = m; 52 } 53 o[i][j] = min; 54 } 55 min = N; 56 for(i = p[n];i <= d;i ++) 57 { 58 if(min > o[n][i]) 59 min = o[n][i]; 60 } 61 printf("%d\n",sum+min); 62 } 63 return 0; 64 }