POJ 1160 Post Office(DP)

题目链接

一开始那个初始化错了,WA了N次啊。。。Vijos上数据太水了,POJ上本来也想水过的,这个感觉将近O(n^4)的复杂度,交上超时了,本来想优化一下预处理出前i个和的,发现好像这个复杂度,找最小的时候,没法优化。。看了DISCUSS,有人就这样水过的,把INT64啥的,小细节改改成了750ms。。。

四边形不等式优化,纠结。。。

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <stdlib.h>

 4 #define N 1000000000

 5 int p[301];

 6 int dp[31][301];

 7 int min(int a,int b)

 8 {

 9     return a > b ? b:a;

10 }

11 int main()

12 {

13     int n,m,i,j,k,u,sum;

14     scanf("%d%d",&n,&m);

15     for(i = 1;i <= n;i ++)

16     {

17         scanf("%d",&p[i]);

18     }

19     if(n <= m)

20     {

21         printf("0\n");

22         return 0;

23     }

24     for(i = 2;i <= n;i ++)

25     {

26         for(j = 1;j <= i-1;j ++)

27         dp[1][i] += p[i]- p[j];

28     }

29     for(i = 2;i <= m;i ++)

30     {

31         for(j = i+1;j <= n;j ++)

32         {

33             dp[i][j] = N;

34             for(k = i-1;k <= j-1;k ++)

35             {

36                 sum = dp[i-1][k];

37                 for(u = k+1;u <= j-1;u ++)

38                 {

39                     sum += min(p[u]-p[k],p[j]-p[u]);

40                 }

41                 if(dp[i][j] > sum)

42                 dp[i][j] = sum;

43             }

44         }

45     }

46     sum = N;

47     for(i = m+1;i <= n;i ++)

48     {

49         for(j = i+1;j <= n;j ++)

50         {

51             dp[m][i] += p[j] - p[i];

52         }

53         if(sum > dp[m][i])

54         sum = dp[m][i];

55     }

56     printf("%d\n",sum);

57     return 0;

58 }

你可能感兴趣的:(Office)