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

【困难】画匠问题-Java:解法一

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.Other; /** * 画匠问题 * * 【题目】 * 给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num表示画匠的数量,每个画匠只 * 能画连在一起的画作。所有的画家并行工作,请返回完成所有的画作需要的最少时间。 * * 【举例】 * arr=[3,1,4],num=2。 * 最好的分配方式为第一个画匠画3和1,所需时间为4。第二个画匠画4,所需时间为4。因为并行工作,所以最少时间为4。如果分配方 * 式为第一个画匠画3,所需时间为3。第二个画匠画1和4,所需的时间为5。那么最少时间为5,显然没有第一种分配方式好。所以返回4。 * arr=[1,1,1,4,3],num=3。 * 最好的分配方式为第一个画匠画前三个1,所需时间为3。第二个画匠画4,所需时间为4。第三个画匠画3,所需时间为3。返回4。 * * 【难度】 * 困难 * * 【解答】 * 方法一。如果只有1个画匠,那么对这个画匠来说,arr[0..j]上的画作最少时间就是arr[0..j]的累加和。如果有2个画匠,对他们 * 来说,画完arr[0..j]上的画作有如下方案: * 方案1:画匠1负责arr[0],画匠2负责arr[1..j],时间为Max{sum[0],sum[1..j]}。 * 方案2:画匠1负责arr[0..1],画匠2负责arr[2..j],时间为Max{sum[0..1],sum[2..j]}。 * ...... * 方案k:画匠1负责arr[0..k],画匠2负责arr[k+1..j],时间为Max{sum[0..k],sum[k+1..j]}。 * 方案j:画匠1负责arr[0..j-1],画匠2负责arr[j]。时间为Max{sum[0..j-1],sum[j]}。 * 每一种方案其实都是一种划分,把arr[0..j]分成两部分,第一部分由画匠1来负责,第二部分由画匠2来负责,两部分的累加和哪个 * 大,哪个就是这种方案的所需时间。最后选所需时间最小的方案,就是答案。当画匠数量为i(i>2)时,假设dp[i][j]的值代表i个画 * 匠搞定arr[0..j]这些画所需的最少时间。那么有如下方案: * 方案1:画匠1~i-l负责arr[0],画匠i负责arr[1..j]->max{dp[i-1][0],sum[1..j]}。 * 方案2:画匠1~i-1负责arr[0..1],画匠i负责arr[2..j]->max{dp[i-1][1],sum[2..j]}。 * ...... * 方案k:画匠1~i-l负责arr[0..k],画匠i负责arr[k+1..j]->max{dp[i-1,k],sum[k+1..j]}。 * 方案j:画匠1~i-1负责arr[0..j-1],画匠i负责arr[j]->max{dp[i-1][j-1],sum[j]}。 * 哪种方案所需的时间最少,dp[i][j]的值就是那种方案所需的时间,即 * dp[i][j]=min{max{dp[i-1][k],sum[k+1..j]}(0<=k<j)} * 具体过程参见如下代码中的solution1方法,此方法使用动态规划常见的空间优化技巧。因为dp[i][j]的值仅依赖dp[i-1][..]的 * 值,所以我们不必生成规模为NumxN大小的矩阵,仅用一个长度为N的数组结构滚动更新、不断复用即可。 * 画匠数目为num,画作数量为N,所以一共是numxN个位置需要计算,每一个位罝都需要枚举所有的方案来找出最好的方案,所以方法一 * 的时间复杂度为O(N^2*num)。 * * @author Created by LiveEveryDay */ public class ArtisanPainterProblem1 { public static int solution1(int[] arr, int num) { if (arr == null || arr.length == 0 || num < 1) { throw new RuntimeException("err"); } int[] sumArr = new int[arr.length]; int[] map = new int[arr.length]; sumArr[0] = arr[0]; map[0] = arr[0]; for (int i = 1; i < sumArr.length; i++) { sumArr[i] = sumArr[i - 1] + arr[i]; map[i] = sumArr[i]; } for (int i = 1; i < num; i++) { for (int j = map.length - 1; j > i - 1; j--) { int min = Integer.MAX_VALUE; for (int k = i - 1; k < j; k++) { int cur = Math.max(map[k], sumArr[j] - sumArr[k]); min = Math.min(min, cur); } map[j] = min; } } return map[arr.length - 1]; } public static void main(String[] args) { int[] arr = {1, 1, 1, 4, 3}; int num = 3; System.out.printf("The result is: %d", solution1(arr, num)); } } // ------ Output ------ /* The result is: 4 */
http://www.zskr.cn/news/1310449.html

相关文章:

  • 上万家资本资源背书:融资信息平台怎么选不踩坑 - 速递信息
  • KMS_VL_ALL_AIO终极激活指南:3分钟免费激活Windows和Office的完整教程
  • 3步从视频到专业动作数据:AI驱动的3D动作捕捉与BVH生成全攻略
  • 2007-2025年上市公司人工智能投入数据
  • 【独家首发】2026 AI工具栈性能压测报告:RAG延迟下降63%的4种向量数据库组合,仅限前500名开发者获取完整Benchmark数据集
  • 免费开源AMD Ryzen处理器调试工具:SMUDebugTool终极指南
  • 在Hermes Agent项目中集成Taotoken实现多模型调用与路由
  • 告别Qt在线安装的坑!手把手教你用VSCode+Qt 5.14.2搭建C++ GUI开发环境(附离线包下载)
  • Taotoken模型广场如何帮助开发者快速选型
  • Spring循环依赖解决方案
  • ApkShellext2:3步让Windows文件管理器智能显示APK原生图标
  • WeChatExporter:基于iOS备份解析的微信聊天记录数据提取架构
  • CSS 伪类完全指南
  • 字符流中第一个只出现一次的字符-C++
  • 3个认知升级:重新定义魔兽世界宏编程的操作范式
  • 构建Telegram与私有AI模型桥接器:从原理到工程实践
  • STM32 串口通信:串口的接收和发送详解
  • d2s-editor:暗黑破坏神2存档编辑器的现代化Web解决方案
  • 如何让Windows资源管理器完美预览iPhone照片:HEIC缩略图插件全解析
  • 如何使用witr快速定位占用端口的神秘进程?完整指南
  • Oto 核心架构深度解析:Context 与 Player 的设计哲学
  • 内容创作团队如何利用多模型API提升图文生成效率
  • 告别单调终端:250+ Xshell配色方案让你的命令行焕然一新
  • 半导体IPO热潮:低营收高专利企业如何重塑资本估值与技术壁垒
  • 从手动点击到Python驱动:探索PyFluent如何重新定义CFD工作流自动化
  • FanControl终极指南:告别BIOS限制,打造个性化风扇控制方案
  • jQuery TreeTable:在表格中优雅展示树形结构的完整指南
  • VCS仿真总失败?手把手教你用TMAX的CPV功能快速定位ATPG Pattern问题
  • Hotkey Detective:3分钟定位Windows热键冲突的神器
  • 从零搭建到日常调试:一份给新手的 Kafka 命令行操作全流程指南