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 }
posted @ 2012-08-23 20:22  Naix_x  阅读(255)  评论(0编辑  收藏  举报