您的位置:首页 > 其它

POJ 1160 Post Office(DP)

2012-08-23 20:22 363 查看
题目链接

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

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1000000000
int p[301];
int dp[31][301];
int min(int a,int b)
{
return a > b ? b:a;
}
int main()
{
int n,m,i,j,k,u,sum;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i ++)
{
scanf("%d",&p[i]);
}
if(n <= m)
{
printf("0\n");
return 0;
}
for(i = 2;i <= n;i ++)
{
for(j = 1;j <= i-1;j ++)
dp[1][i] += p[i]- p[j];
}
for(i = 2;i <= m;i ++)
{
for(j = i+1;j <= n;j ++)
{
dp[i][j] = N;
for(k = i-1;k <= j-1;k ++)
{
sum = dp[i-1][k];
for(u = k+1;u <= j-1;u ++)
{
sum += min(p[u]-p[k],p[j]-p[u]);
}
if(dp[i][j] > sum)
dp[i][j] = sum;
}
}
}
sum = N;
for(i = m+1;i <= n;i ++)
{
for(j = i+1;j <= n;j ++)
{
dp[m][i] += p[j] - p[i];
}
if(sum > dp[m][i])
sum = dp[m][i];
}
printf("%d\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: