当前位置: 首页 > article >正文

【困难】邮局选址问题-Java:解法二

分享一个大牛的人工智能教程。零基础通俗易懂风趣幽默希望你也加入到人工智能的队伍中来请轻击人工智能教程大家好欢迎来到我的网站 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑人工智能时代就要来临了科… 继续阅读 前言https://www.captainai.net/troubleshooterpackage live.every.day.ProgrammingDesign.CodingInterviewGuide.Other; /** * 邮局选址问题 * * 【题目】 * 一条直线上有居民点邮局只能建在居民点上。给定一个有序整型数组arr每个值表示居民点的一维坐标再给定一个正数num表 * 示邮局数量。选择num个居民点建立num个邮局使所有的居民点到邮局的总距离最短返回最短的总距离。 * * 【举例】 * arr[1,2,3,4,5,1000]num2。 * 第一个邮局建立在3位置第二个邮局建立在1000位置。那么1位置到邮局距离为22位置到邮局距离为13位置到邮局距离为04位 * 置到邮局距离为15位置到邮局距离为21000位置到邮局距离为0。所以这种方案下的总距商为6其他任何方案的总距离都不会比 * 该方案的总距离更短所以返回6。 * * 【难度】 * 困难 * * 【解答】 * 方法一动态规划。首先解决一个问题如果在arr[i..j](0ijN)区域上只能建一个邮局并且这个区域上的居民点都前往这 * 个邮局要让arr[i..j]上所有的居民点到邮局的总距离最短这个邮局应该建在哪里如果arr[i..j]上有奇数个民居点邮局建 * 在中点位置会使总距离最短如果arr[i..j]上有偶数个民居点此时认为中点有两个邮局建在哪个中点上都行都会使总距离最 * 短。根据这种思路我们先生成一个规模为NxN的矩阵ww[i][j](0ijN)的值代表如果在arr[i..j](0ijN)区域上 * 只建一个邮局这一区间上的总距离为多少。因为始终有ij的要求所以我们求w矩阵的时候实际上只求w矩阵的一半。 * 求w矩阵的过程。在求每一个位置w[i][j]的时候求法并不是把区间arr[i..j]上的每个位置到中点的距离求出后累加这样求虽然 * 肯定正确但会很慢。更快速的求法是如果已经求出了w[i][j-1]的值那么w[i][j]w[i][j-1]arr[j]-arr[(ij)/2]。解 * 释一下这是为什么如果arr[i..j-1]上有奇数个点那么中点是arr[(ij-1)/2]加上arr[j]之后arr[i..j]有偶数个点 * 第一个中点是arr[(ij)/2]。在这种情況下(ij-1)/2和(ij/2)其实是同一个位置。比如arr[i..j-1][4,15,26]中 * 点是15。arr[i..j][4,15,26,47]第一个中点是15。所以此时w[i][j]比w[i][j-1]多出来的距离就是arr[j]到 * arr[(ij)/2]的距离即w[i][j]w[i][j-1]arr[j]-arr[(ij)/2]。如果arr[i..j-1]上有偶数个点中点有两个无 * 论选在哪一个w[i][j-1]的值都是一样的。加上arr[j]之后arr[i..j]有奇数个点中点是arr[(ij)/2]。在这种情況下 * arr[i..j-1]上的第二个中点和arr[i..j]上唯一的中点其实是同一个位置。比如arr[i..j-1][4,15,26,47]第二个中点 * 是26。arr[i..j][4,15,26,47,53]唯一的中点是26。所以此时w[i][j]比w[i][j-1]多出来的距离还是arr[j]到 * arr[(ij)/2]的距离即w[i][j]w[i][j-1]arr[j]-arr[(ij)/2]。所以w矩阵求解的代码片段如下。 * 如上代码中让把w申请成规模(N1)x(N1)的原因是为了在接下来的代码实现中省去很多越界的判断实际上w的有效区域就是 * w[0..N][0..N]中的一半剩下的部分都是0。 * 有了w矩阵之后接下来介绍动态规划的过程。dp[a][b]的值代表如果在arr[0..b]上建设a1个邮局总距离最少是多少。所以 * dp[0][b]的值代表如果在arr[0..b]上建设1个邮局总距离最少是多少。很明显总距离最少是w[0][b]。那么dp[0][0..N-1] * 上的所有值都可以直接赋值即如下的代码片段。 * 当arr[0..b]上可以建设不止1个邮局时即dp[a][b](a0)时应该如何计算举例说明比如arr[-3,-2,-1,0,1,2]要计 * 算dp[2][5]的值即可以在arr[0..5]上建立3个邮局的情况下最少的总距离是多少并且此时已经有dp[0..1][0..5]的所有值。 * 方案1邮局1、2负责[-3]邮局3负责[-2,-1,0,1,2]距离dp[1][0]w[1][5]。 * 方案2邮局1、2负责[-3,2]邮局3负责[-1,0,1,2]距离dp[1][1]w[2][5]。 * 方案3邮局1、2负责[-3,-2,-1]邮局3负责[0,1,2]距离dp[1][2]w[3][5]。 * 方案4邮局1、2负责[-3,-2,-1,0]邮局3负责[1,2]距离dp[1][3]w[4][5]。 * 方案5邮局1、2负责[-3,-2,-1,0,1]邮局3负责[2]距离dp[1][4]w[5][5]。 * 方案6邮局1、2负责[-3,-2,-1,0,1,2]邮局3负责[]距离dp[1][5]w[6][5](w越界为0)。 * 枚举所有的划分方案选一个距离最短的即可所以dp[a][b]Min{dp[a-1][k]w[k1][b](0kN}。 * 方法一的全部过程请参看如下代码中的minDistances1方法。 * w矩阵的求解过程O(N^2)动态规划的求解过程O(N^2*num)。所以方法一总的时间复杂为O(N^2)O(N^2*num)即O(N^2*num)。 * * 方法二用四边形不等式优化动态规划的枚举过程使整个过程的时间复杂度降低至O(N^2)。在方法一中求解dp[a][b]的时候几乎 * 枚举了所有的dp[a-1][0..b]但这个枚举过程其实是可以得到加速的。具体解释为 * 1.当邮局为a-l个区间为arr[0..b]时如果在其最优划分方案中发现邮局1~a-2负责arr[0..l]邮局a-l负责arr[l1..b]。 * 那么当邮局为a个区间为arr[0..b]时如果想得到最优方案邮局1~a-1负责的区域不必尝试比arr[0..1]小的区域只需尝试 * arr[0..k](k1)。 * 2.当邮局为a个区间为arr[0..b1]时如果在其最优划分方案中发现邮局1~a-1负责arr[0..m]邮局a负责arr[m1..b1]。 * 那么当邮局为a个区间为arr[0..b]时如果想得到最优方案邮局1~a-1负责的区域不必尝试比arr[0..m]大的区域只尝试 * arr[0..k](km)。 * 本题为何能用四边形不等式进行优化的证明略。有兴趣的读者可以自行学习四边形不等式的相关内容。有了这个枚举优化过程后在 * 算dp[a][b]时只用在dp[a-1][b]的最优尝试位置1和dp[a][b1]的最优尝试位置m之间进行枚举其他的位置一概不用再试。具 * 体过程请参看如下代码中的minDistances2方法。 * * author Created by LiveEveryDay */ public class PostOfficeAddressProblem2 { public static int minDistances2(int[] arr, int num) { if (arr null || num 1 || arr.length num) { return 0; } int[][] w new int[arr.length 1][arr.length 1]; for (int i 0; i arr.length; i) { for (int j i 1; j arr.length; j) { w[i][j] w[i][j - 1] arr[j] - arr[(i j) / 2]; } } int[][] dp new int[num][arr.length]; int[][] s new int[num][arr.length]; for (int j 0; j ! arr.length; j) { dp[0][j] w[0][j]; s[0][j] 0; } int minK 0; int maxK 0; int cur 0; for (int i 1; i num; i) { for (int j arr.length - 1; j i; j--) { minK s[i - 1][j]; maxK j arr.length - 1 ? arr.length - 1 : s[i][j 1]; dp[i][j] Integer.MAX_VALUE; for (int k minK; k maxK; k) { cur dp[i - 1][k] w[k 1][j]; if (cur dp[i][j]) { dp[i][j] cur; s[i][j] k; } } } } return dp[num - 1][arr.length - 1]; } public static void main(String[] args) { int[] arr {1, 2, 3, 4, 5, 1000}; int num 2; System.out.printf(The min distance is: %d, minDistances2(arr, num)); } } // ------ Output ------ /* The min distance is: 6 */

相关文章:

【困难】邮局选址问题-Java:解法二

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#x…...

3步搞定Unity游戏资源修改:UABEA零代码模组制作完全指南

3步搞定Unity游戏资源修改:UABEA零代码模组制作完全指南 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 你是否曾梦想过亲手改造喜欢的游戏,却因复杂的编程门槛望而却步&#x…...

Zotero重复文献清理深度解析:3步实现高效文献库去重管理

Zotero重复文献清理深度解析:3步实现高效文献库去重管理 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 你是否曾因文献库中大量重…...

探索未来云计算的航标:Crane如何简化容器编排管理

探索未来云计算的航标:Crane如何简化容器编排管理 【免费下载链接】crane Yet another control plane based on docker built-in swarmkit 项目地址: https://gitcode.com/gh_mirrors/crane/crane 在当今快速发展的云计算领域,容器编排已成为构建…...

如何快速上手InstagramApiSharp:.NET平台的完整私人Instagram API指南

如何快速上手InstagramApiSharp:.NET平台的完整私人Instagram API指南 【免费下载链接】InstagramApiSharp A complete Private Instagram API for .NET (C#, VB.NET). 项目地址: https://gitcode.com/gh_mirrors/in/InstagramApiSharp InstagramApiSharp是一…...

计算机毕业设计:Python股票交易可视化管理系统 Django框架 requests爬虫 数据分析 可视化 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

5分钟搞定!用Moonlight TV在大屏电视上畅玩PC游戏 [特殊字符]

5分钟搞定!用Moonlight TV在大屏电视上畅玩PC游戏 🎮 【免费下载链接】moonlight-tv Lightweight NVIDIA GameStream Client, for LG webOS TV and embedded devices like Raspberry Pi 项目地址: https://gitcode.com/gh_mirrors/mo/moonlight-tv …...

如何快速获取百度网盘直链:3步终极解决方案告别限速困扰

如何快速获取百度网盘直链:3步终极解决方案告别限速困扰 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾因百度网盘的下载速度限制而倍感焦虑?…...

终极显卡驱动清理工具Display Driver Uninstaller完整使用指南

终极显卡驱动清理工具Display Driver Uninstaller完整使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …...

Tau:革命性Git-Native CDN PaaS平台,构建自主云计算网络的终极指南

Tau:革命性Git-Native CDN PaaS平台,构建自主云计算网络的终极指南 【免费下载链接】tau Fullstack Workspace for Humans & Machines 项目地址: https://gitcode.com/gh_mirrors/ta/tau Tau(全称Taubyte)是一个革新性…...

【异常】QClaw客户端安装失败(OpenClaw资源解压出错)问题排查与修复指南: 安装失败:OpenClaw 资源解压出错。 请重新安装或联系支持。

QClaw客户端安装失败(OpenClaw资源解压出错)问题排查与修复指南 本文针对QClaw客户端安装/更新过程中出现的“OpenClaw资源解压出错”报错,完整梳理报错信息、根因说明,并提供分阶段、可落地的标准化修复方案,保障客户端正常部署。 一、报错内容 触发场景:QClaw客户端执…...

Ash Framework与Phoenix集成:构建完整Web应用的终极指南

Ash Framework与Phoenix集成:构建完整Web应用的终极指南 【免费下载链接】ash A declarative, extensible framework for building Elixir applications. 项目地址: https://gitcode.com/gh_mirrors/ash/ash Ash Framework是一个声明式、可扩展的Elixir应用框…...

告别回调地狱:用Rust async/await优雅封装UCX高性能通信库

用Rust异步编程重构UCX:从回调地狱到协程优雅 在当今高性能计算和分布式系统领域,UCX(Unified Communication X)作为统一通信抽象层的重要性与日俱增。然而,其基于C语言的回调式异步编程模型,让不少开发者望…...

告别存储焦虑:巧用Alist与RaiDrive,将百度网盘无缝变成本地硬盘

1. 为什么你的电脑总是不够用? 每次打开电脑,那个刺眼的红色存储空间警告就像个定时炸弹一样跳出来。你可能已经删掉了无数个"暂时用不到"的文件,清空了回收站,甚至卸载了几个很久不用的软件,但没过多久&…...

别再让舵机乱抖了!STM32F103C8T6驱动MG90S的完整配置流程(附代码)

从零构建稳定舵机控制系统:STM32F103C8T6与MG90S深度实战指南 第一次尝试用STM32驱动MG90S舵机时,我盯着那个抽搐的金属齿轮发了半小时呆——它时而疯狂抖动,时而完全静止,就像在嘲笑我的代码。这不是个例,几乎所有嵌入…...

算法正确性证明终极指南:数学归纳法与循环不变式实战应用

算法正确性证明终极指南:数学归纳法与循环不变式实战应用 【免费下载链接】CLRS :notebook:Solutions to Introduction to Algorithms 项目地址: https://gitcode.com/gh_mirrors/cl/CLRS 算法正确性证明是计算机科学中的核心技能,它确保我们设计…...

3步搞定显卡驱动残留:Display Driver Uninstaller终极清理指南

3步搞定显卡驱动残留:Display Driver Uninstaller终极清理指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-unin…...

DemoGPT AgentHub:一站式LLM智能体开发平台深度解析与实践指南

1. DemoGPT AgentHub:一站式LLM智能体开发平台深度解析如果你正在寻找一个能够快速构建、测试和部署大型语言模型(LLM)智能体的工具,并且希望它集成了从搜索、计算到文档检索的各类工具,同时又能让你轻松定制自己的逻辑…...

AQS原理+ReentrantLock源码+与synchronized深度对比

并发编程是Java高级开发的核心门槛,而AQS、ReentrantLock、synchronized则是并发领域的“铁三角”。很多开发者只会用ReentrantLock和synchronized做同步,却不懂其底层依赖的AQS框架;面试时被问“ReentrantLock和synchronized的区别”“AQS原…...

从Kaggle到公司A/B测试:聊聊软件工程有效性威胁那些‘接地气’的事儿

从Kaggle到公司A/B测试:聊聊软件工程有效性威胁那些‘接地气’的事儿 在数据科学竞赛和互联网产品迭代中,我们常常会遇到一些令人困惑的现象:Kaggle排行榜上的冠军模型在实际业务中表现平平,A/B测试的显著效果上线后却石沉大海。…...

终极指南:Open Images数据集质量评估 - 机器标注vs人工验证的准确率对比

终极指南:Open Images数据集质量评估 - 机器标注vs人工验证的准确率对比 【免费下载链接】dataset The Open Images dataset 项目地址: https://gitcode.com/gh_mirrors/dat/dataset Open Images数据集作为GitHub加速计划(gh_mirrors/dat/dataset…...

Hypnos-i1-8B效果展示:多步数学证明、Python代码生成真实作品集

Hypnos-i1-8B效果展示:多步数学证明、Python代码生成真实作品集 1. 模型能力概览 Hypnos-i1-8B是一款基于量子噪声注入训练的8B参数开源大模型,专注于复杂逻辑推理和数学问题求解。该模型在以下领域展现出卓越能力: 复杂逻辑推理&#xff…...

3步解锁NCM音频:从格式壁垒到自由播放的完整解决方案

3步解锁NCM音频:从格式壁垒到自由播放的完整解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump NCM文件转换是许多网易云音乐用户面临的核心技术挑战,ncmdump工具作为一款轻量级解密工具,能够…...

Flux2-Klein-9B-True-V2惊艳效果:风格迁移+细节增强真实生成案例分享

Flux2-Klein-9B-True-V2惊艳效果:风格迁移细节增强真实生成案例分享 1. 模型能力概览 Flux2-Klein-9B-True-V2是基于官方FLUX.2 [klein] 9B改进的文生图/图生图模型,在风格迁移和细节增强方面表现出色。这个模型不仅能根据文字描述生成高质量图片&…...

深入解析Stellar Core:从复制状态机到SCP共识的实战部署指南

1. 项目概述:理解Stellar Core的核心角色如果你对区块链技术,尤其是那些专注于支付和资产转移的公链感兴趣,那么“Stellar Core”这个名字你一定不陌生。它不是某个炫酷的前端应用,也不是一个轻量级的钱包SDK,而是整个…...

oh-my-codex:基于命令行的个人代码片段管理器,提升开发效率

1. 项目概述与核心价值最近在整理个人知识库和代码片段时,发现了一个让我眼前一亮的开源项目:Yeachan-Heo/oh-my-codex。作为一个长期与代码打交道的开发者,我们都有过类似的痛点:辛辛苦苦写出来的、解决特定问题的代码片段&#…...

半监督学习中的标签传播算法原理与实践

1. 半监督学习与标签传播算法概述在机器学习实践中,我们常常面临标注数据稀缺的困境。传统监督学习需要大量标注样本,而数据标注往往需要耗费高昂的人力成本。半监督学习(Semi-Supervised Learning)正是为了解决这一痛点而诞生的技…...

React Native App Auth源码架构解析:理解AppAuth桥接层实现原理

React Native App Auth源码架构解析:理解AppAuth桥接层实现原理 【免费下载链接】react-native-app-auth React native bridge for AppAuth - an SDK for communicating with OAuth2 providers 项目地址: https://gitcode.com/gh_mirrors/re/react-native-app-aut…...

物联网中的设备连接与数据智能

物联网中的设备连接与数据智能正以前所未有的速度重塑我们的世界。从智能家居到工业自动化,数十亿台设备通过互联网相互连接,实时生成海量数据。这些数据经过智能分析,不仅优化了设备性能,还催生了全新的商业模式和服务形态。本文…...

[数据集][目标检测]榴莲成熟度检测数据集VOC+YOLO格式2552张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):2552标注数量(xml文件个数):2552标注数量(txt文件个数):2552标注类别…...