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 }