传送门

Description

高速公路旁边有一些村庄。高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识。没有两个在同样地方的村庄。两个位置之间的距离是其整数坐标差的绝对值。

邮局将建在一些,但不一定是所有的村庄中。为了建立邮局,应选择他们建造的位置,使每个村庄与其最近的邮局之间的距离总和最小。

你要编写一个程序,已知村庄的位置和邮局的数量,计算每个村庄和最近的邮局之间所有距离的最小可能的总和。

Solution

大概是把dp的常见优化的经典练习题都打了一波。

这是四边形不等式优化的题目。证明?百度百科上就很不错了,就不说了。

满足\(f[i][j]\) 的决策点会在\(f[i][j-1]\)和\(f[i+1][j]\)的决策点之间

Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 3005
#define mN 305
int V,P,a[MN],f[MN][mN],q[MN],d[MN][MN],g[MN][mN];
inline int dis(int l,int r)
{
if(d[l][r]) return d[l][r];
else return d[l][r]=q[r]+q[l-1]-q[(l+r)>>1]-q[(l+r-1)>>1];
}
int main()
{
V=read();P=read();
memset(f,0x3f,sizeof f);
register int i,j,k;
for(i=1;i<=V;++i) a[i]=read(),q[i]=q[i-1]+a[i];
std::sort(a+1,a+V+1); for(i=1;i<=V;++i) f[i][1]=dis(1,i); for(g[V+1][k=2]=V;k<=P;++k,g[V+1][k]=V)
for(i=V;i>=1;--i)for(j=g[i][k-1];j<=g[i+1][k];++j)
if(f[j][k-1]+dis(j+1,i)<f[i][k])
f[i][k]=f[j][k-1]+dis(j+1,i),g[i][k]=j;
return 0*printf("%d\n",f[V][P]);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

最新文章

  1. ES6 语法笔记
  2. [WPF系列-高级TemplateBinding vs RelativeSource TemplatedParent]
  3. IOS调用系统声音(键盘声音)
  4. 你应该知道的那些Android小经验
  5. 《Linux内核设计与实现》读书笔记(十九)- 可移植性
  6. JS获取客户端的窗口大小
  7. 给hexo添加评论系统
  8. SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)
  9. Goland2019.1破解
  10. R语言数据接口
  11. mybatis插入数据后返回自增的主键id
  12. Oracle客户端的安装与远程连接配置
  13. 你所要掌握的最简单基础的React渲染优化
  14. ASP.net显示当前系统在线人数
  15. ES6躬行记(22)——Promise
  16. SAP函数 CS_WHERE_USED_MAT 反查上层BOM
  17. [CSS3] 二级下拉导航
  18. Oracle记录登录失败的触发器
  19. Redis构建全局并发锁
  20. foreach循环时动态往数组里添加数据

热门文章

  1. ORACLE锁表查询及解锁方法
  2. windowsAPI创建句柄失败的返回值
  3. .net SHA-256 SHA-1
  4. SSH和SSM对比异同点、各自优势
  5. python3 访问 rabbitmq 示例
  6. Go 操作 Mysql(二)
  7. Pytorch 1.0升级到Pytorch 1.1.0
  8. JS做动态表格
  9. Linux之python3编译安装
  10. ubuntu 启动图形界面 sudo init 5