算法:邮局选址问题

2023-11-13

一条直线上有N个居民点,需要建设K个邮局,邮局只能建在居民点上,则所有居民点到最近邮局到最短距离是?

动态规划,时间O(N*N)

核心思想:
外层循环,邮局数量K,直到包括最大邮局:
中层循环,区间[0,R],直到包括整个区间:
内层循环,从[0,R]区间k个邮局,扩展到[0,R]区间k+1个邮局需要枚举R次。

总时间复杂度O(NNK),后面进行细节和时间优化。


接下来分析具体过程:

dp表设置如下:dp[i][j]表示i个邮局在区间[0,j]上的最短距离。
则方法为,先左向右,再上至下填整个dp表。

从[0,R]区间k个邮局,扩展[0,R]区间k+1个邮局到方法:
依次 计算k个区间负责[0,L] 和 1个区间负责[L+1,R] 的总距离,取最小的一个,
即 dp[k+1][R] = min{ dp[k][L] + w[L+1][R] }

其中,w[i][j] 为辅助表,存储只建一个邮局在区间[i…j]上的总距离,方便计算。


预处理w表时间优化:

快速求解w[i][j]的办法,贪心思想直接找中点,这里找左中点,即L/2,稍加思考发现,左右中点的解是一样的。

但是,枚举所有区间[i…j]的中点,时间复杂度为O(N*N),依然可以优化。

w[i][j] 和 w[i][j-1] 有如下关系:

w[i][j] = w[i][j-1] + Arr[j] - Arr[(i+j)/2],无论区间[i…j]为奇偶长度,这个式子都成立,这里Arr[i]是居民点坐标。

求解w表,时间复杂度,降为O(N)


dp核心思想时间优化:至时间O(N*N)

最内层循环枚举过程可以降至O(1),利用四边形不等式,大概思想如下:

若已知[0,L]由k个邮局负责,[L+1][R]由1个邮局负责,是dp[k+1][R]上最小距离。
那么,
当求解dp[k+2][R]时,最小值一定存在于[0,L+t]由k+1个邮局负责,[L+t+1][R]由1个邮局负责。
此时,需要一个额外数组L[k][R],记录dp[k][R]最小值时,L的位置。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法:邮局选址问题 的相关文章

随机推荐

  • 示波器的原理和使用

    1 示波器简介 示波器是一种用来测量交流电或脉冲电流波的形状的仪器 由电子管放大器 扫描振荡器 阴极射线管等组成 除观测电流的波形外 还可以测定频率 电压强度等 凡可以变为电效应的周期性物理过程都可以用示波器进行观测 2 示波器的分类 模拟
  • 前端html后端java_前端html向后端java传递数据的几种方式(暂时使用到)

    注 data 类型可按照具体场景 具体定义 不仅仅只有下面的传递方式 1 删除 前段传递方式为dataType JSON type DELETE 前段 ajax url interfaces deleteAccessRule id type
  • win10 Face_recognition教程

    文章目录 1 pip加速下载 更改pip镜像源 2 face recognition配置 1 安装dlib 2 安装face recognition modules 3 安装face recognition 4 人脸识别开源项目集锦 htt
  • HashMap的使用

    put方法 Hashmap的put方法放值 可以单次向HashMap中添加一个键值对 没有顺序 HashMap
  • 微信小程序开发笔记一

    微信小程序开发笔记 一 微信小程序的结构 1 初识小程序 2 快捷键 3 查阅文档 二 常用组件 1 input组件 2 button组件 三 小程序中的函数 1 函数的两种定义方法 2 带参函数 3 js中的默认函数 4 其它常用函数 四
  • vue在原有的类名上,动态渲染添加新类名

    vue在原有的类名上 动态渲染添加新类名
  • Redis相关-03

    Redis相关 03 Redis配置文件详解 持久化 RDB操作 持久化 AOF操作 Redis订阅发布 Redis集群环境搭建 主从复制 宕机手动配置主机 哨兵模式 缓存穿透以及雪崩 一 Redis配置文件详解 1 单位说明 Note o
  • S7-1500系列博途中使用SCL语言编程方法简介

    SCL Structured Contorl Language 结构化控制语言 在TIA博途软件中 默认支持SCL语言 在建立程序块时可以直接选择SCL语言 SCL语言类似计算机高级语言 如果你有C Java C Python这种高级语言的
  • gradle 历史版本下载链接

    https gradle org releases
  • 阿里云解决外网不能访问

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 未配置该端口安全策略 配置如下后 所有ip都可以访问 全部端口都可以使用了 如果只需要特定ip或端口开放也可以进行设置 2 防火墙的原因 我写了关于centos开启防火墙和开放
  • C# 1. 介绍

    1 介绍 C 读作 See Sharp 是一种简洁 现代 面向对象且类型安全的编程语言 C 起源于 C 语言家族 因此 对于 C C 和 Java 程序员 可以很快熟悉这种新的语言 C 已经分别由 ECMA International 和
  • 启动VMware虚拟机时出现黑屏解决办法

    以管理员身份运行 命令提示符 gt 输入命令 netsh winsock reset gt 运行后重启电脑 gt Enjoy it 上述命令作用 重置winsock网络规范
  • linux etc下的profile和/etc/bashrc

    etc profile的设置方法对所有登录的用户都有效 bashrc只对当前用户有效 上面两个都是配置文件 开机后 系统会先读取 etc profile 再读 bashrc 不同的用户 bashrc文件可以有不同的设置 而 etc prof
  • GitHub使用--上传一个文件

    上传文件到GitHub需要用到两个软件 分别是GitHub TortoiseGit 创建步骤如下 1 选择文件夹 2 右键选择 代码仓库 3 如果上传的文件根目录是这个 就不勾选 反之勾选 4 确认 5 文件右击选择commit 6 填写M
  • 扩展阿里p3c实现自定义代码规范检查

    前段时间fastjson报出了漏洞 只要打开setAutoType特性就会存在风险 自己测试环境的一个项目被揪出来了 虽然改动很小 但就是觉得憋屈 fastjson还是挺好的 想着禁用的话太可惜 用的话又要注意安全 就想着找款工具提示下在用
  • Node.js基础——模块

    文章目录 在Vscode上使用node js运行js代码 法一 终端运行 法二 右键Run Code Vsode设置node代码提示 CommonJS规范 模块化规范 JS标准的缺陷 没有模块化系统带来的影响 CommonJS的模块化规范
  • Flutter运行在Android上卡Running Gradle task ‘assembleDebug...

    Flutter运行在Android上卡Running Gradle task assembleDebug 是因为无法访问官方源 下面进行换源 1 修改配置文件 buildscript repositories google mavenCen
  • 代码静态分析

    1 简介 静态测试包括代码检查 静态结构分析 代码质量度量等 它可以由人工进行 充分发挥人的逻辑思维优势 也可以借助软件工具自动进行 代码检查代码检查包括代码走查 桌面检查 代码审查等 主要检查代码和设计的一致性 代码对标准的遵循 可读性
  • 微信小程序中使用video组件

    文章目录 前情提要 搭建视频服务器 小程序项目 app json pages index index wxml pages index index wxss pages index index js 相关链接 前情提要 小程序里要放置视频
  • 算法:邮局选址问题

    一条直线上有N个居民点 需要建设K个邮局 邮局只能建在居民点上 则所有居民点到最近邮局到最短距离是 动态规划 时间O N N 核心思想 外层循环 邮局数量K 直到包括最大邮局 中层循环 区间 0 R 直到包括整个区间 内层循环 从 0 R