Luogu P4767「IOI2000」邮局
时间:2021-08-24
本文章向大家介绍Luogu P4767「IOI2000」邮局,主要包括Luogu P4767「IOI2000」邮局使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
P4767「IOI2000」邮局
显然 DP ,考虑设 \(f_{i,j}\) 表示前 \(j\) 个村庄放了 \(i\) 个邮局的最小距离,为了方便 DP ,我们钦定这个区间里的村庄都匹配这些邮局。
那么转移式写出来就是 :
\[f_{i,j} = \min_{k=1}^{j-1} \left\{ f_{i,k-1} + w(k+1,j) \right\}
\]
其中, \(w(l,r)\) 表示区间 \(\left[ l,r \right]\) 中放一个邮局的贡献,由初中知识可知取最中间的村庄放置邮局一定最优。
那么就有:
\[w(l,r) = w(l,r-1) + X_{r} - X_{\lfloor \frac{l+r}{2} \rfloor}
\]
显然, $ w $ 是满足四边形不等式和区间包含单调性的。
\[\text{设 } l_1 \le l_2 \le r_1 \le r_2 ,\\
\text{则 } w(l_1,r_1) + w(l_2,r_2) = \sum_{i=1}^{\lfloor \frac{l_1+r_1}{2} \rfloor} \left( X_{r_1-i+1} - X_{i} \right) +
\sum_{i=1}^{\lfloor \frac{l_2+r_2}{2} \rfloor} \left( X_{r_2-i+1} - X_{i} \right) ,\\
w(l_1,r_2) + w(l_2,r_1) = \sum_{i=1}^{\lfloor \frac{l_1+r_2}{2} \rfloor} \left( X_{r_2-i+1} - X_{i} \right) +
\sum_{i=1}^{\lfloor \frac{l_2+r_1}{2} \rfloor} \left( X_{r_1-i+1} - X_{i} \right) ,\\
\]
对比这两个式子,发现加的项和减的项数量都分别相同,观察项数的分配,发现,在第二个式子中,加的项更集中于靠近 \(r_2\) ,减的项更集中于 \(l_1\) ,所以符合四边形不等式。
然后 ,根据套路 \(g_{i-1,j} \le g_{i,j} \le g_{i,j+1}\) ,倒序跑 DP 即可,时间复杂度 \(O(VP)\) 。
其中 \(g_{i,j}\) 表示 \(f_{i,j}\) 的最小最优决策点。
#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
const int N=3010;
const int M=310;
int f[N][M],n,m,w[N],g[N][N],fr[N][M];
bool cmp(int a,int b){return a<b;}
int main(){
scanf("%d%d",&n,&m);
fo(i,1,n)scanf("%d",&w[i]);
sort(w+1,w+n+1,cmp);
fo(i,1,n){
fo(j,i+1,n)
g[i][j]=g[i][j-1] + w[j] - w[(i+j)/2];
}
memset(f,127,sizeof(f));
f[0][0]=0;
fo(j,1,m){
fr[n+1][j]=n;
fd(i,n,1){
fo(r,fr[i][j-1],fr[i+1][j]){
int tmp=f[r][j-1] + g[r+1][i];
if(tmp<f[i][j]){
f[i][j]=tmp;
fr[i][j]=r;
}
}
}
}
printf("%d\n",f[n][m]);
return 0;
}
原文地址:https://www.cnblogs.com/Kelvin2005/p/15181982.html
- Redis 4.0.0 一键安装脚本,CentOS 7 systemd 完美启动
- Spring boot with Apache Hive
- Apache Hive 快速入门
- CentOS 7.3 + Server JRE 1.8 + Hadoop-2.8.0
- Apache Hbase 快速入门
- Mototrbo TMS 协议分析(数字电台短信协议分析)
- Nginx 反向代理可以缓存 HTTP POST 请求页面吗?
- Spring boot with Hive
- Spring data 如何定义默认时间与日期
- Spring boot with Oauth2
- Elasticsearch Cluster 安装与配置
- 数据库结构版本控制
- 【Golang语言社区】LollipopGo框架之商城项目--路由设置
- "LollipopGo/library/lollipop/common" 测试3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- html可伸缩侧边栏
- Dubbo 压测插件的实现——基于 Gatling
- html自定义checkbox样式
- 宝塔面板7.4.2及Windows面板6.8数据库鉴权漏洞 – 官方发布紧急安全更新
- ESP32刷入Ruff Lite固件
- Angularjs1.x ES6接入Chart图表
- 搭建Blynk开源物联网服务端(1)---基本搭建
- 搭建Blynk开源物联网服务端(2)---开始使用
- NPM安装模块报错:Error: sha1-W+8rAcUcgURBLVhzyvg+IvHsa4Q= integrity checksum failed when using sha1: wanted
- OPA Gatekeeper 策略入门
- 给Linux命令行加个问候语
- RaspberryPi接入HomeKit
- React Fetch请求
- React使用代理解决跨域问题
- React登录跳转遇到的问题