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 }

你可能感兴趣的:(HDU)