【题目大意】

v个村庄p个邮局,邮局在村庄里,给出村庄的位置,求每个村庄到最近邮局距离之和的最小值。

【思路】

四边形不等式,虽然我并不会证明:(

dp[i][j]表示前i个村庄建j个邮局的最小值,w[i][j]表示在i到j之间建立一个邮局的最小值。w[i][j]显然取i~j的中位数,可以在O(1)时间内求出。

显然dp[i][j]=min{dp[k][j-1]+w[k+1][i]}。

傻傻写错i和j……

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXV=;
const int MAXP=;
const int INF=0x7fffffff;
int v,p;
int dis[MAXV],sum[MAXV],w[MAXV][MAXV];//w[i][j]表示在[i,j]间建立一个邮局的最小代价
int s[MAXV][MAXP],dp[MAXV][MAXP]; void init()
{
scanf("%d%d",&v,&p);
sum[]=;
for (int i=;i<=v;i++) scanf("%d",&dis[i]);
sort(dis+,dis+v+);
for (int i=;i<=v;i++) sum[i]=dis[i]+sum[i-];
for (int i=;i<=v;i++)
{
w[i][i]=;
for (int j=i+;j<=v;j++)
{
if ((i+j)%==) w[i][j]=sum[j]-sum[(i+j)/]-sum[(i+j)/-]+sum[i-];
else w[i][j]=sum[j]-sum[(i+j)/]-sum[(i+j)/-]+sum[i-]-dis[(i+j)/];
}
}
} void solve()
{
memset(dp,,sizeof(dp));
for (int i=;i<=v;i++) dp[i][]=w[][i];
for (int j=;j<=p;j++)
{
s[v+][j]=v-;
for (int i=v;i>=j;i--)
{
for (int k=s[i][j-];k<=s[i+][j];k++)
{
if (dp[i][j]>dp[k][j-]+w[k+][i])//一开始这里敲成了w[k+1][j]
{
dp[i][j]=dp[k][j-]+w[k+][i];
s[i][j]=k;
}
}
}
}
printf("%d",dp[v][p]);
} int main()
{
init();
solve();
return ;
}

最新文章

  1. ACM: Gym 101047E Escape from Ayutthaya - BFS
  2. Lua Coroutine详解
  3. Redis中统计各种数据大小的方法
  4. C# 匿名函数 详解
  5. Hibernate框架概念
  6. ubuntu + hadoop2.5.2分布式环境配置
  7. 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
  8. rand5()产生rand7()
  9. iOS8中添加的extensions总结(一)——今日扩展
  10. IIS启用GZip压缩
  11. phpstorm php $post数据为空的原因
  12. 【Python3之内置函数】
  13. 举例MyBatis的常用的API及方法
  14. 【NOIP2016TG】solution
  15. [Swift]LeetCode144. 二叉树的前序遍历 | Binary Tree Preorder Traversal
  16. Unity资源 ----加载最好需要做哪些事
  17. Springfox与swagger的整合使用
  18. 2.04-proxy-handler
  19. C盘满了如何清理
  20. IIS 6 备忘

热门文章

  1. 通过删除hbase表中的region来达到删除表中数据
  2. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)
  3. 【leetcode 简单】第十八题 爬楼梯
  4. 大聊PYthon----生成器
  5. bootstrap带图标的按钮与图标做连接
  6. GO-指针与函数
  7. IP负载均衡技术
  8. Laravel 中自定义日志目录
  9. openssh升级步骤
  10. leetcode 之Search in Rotated Sorted Array(四)