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 }
posted @ 2012-07-25 21:02  Naix_x  阅读(220)  评论(0编辑  收藏  举报