当前位置: 首页 > 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.jsqmd.com/news/839502/

相关文章:

  • 2026 全年天津律师深度测评,调研 6 个月专业维度综合评比 - 速递信息
  • 上万家资本资源背书:融资信息平台怎么选不踩坑 - 速递信息
  • 5步掌握B站视频下载:BiliTools跨平台工具箱终极指南
  • MCP脚手架工具:快速构建AI插件化服务的开发实践
  • APK Installer终极指南:在Windows上无缝安装Android应用的完整解决方案
  • 从 Computer Use到 Datacenter Use:如何让 AI Agent 像调用函数一样驱动数据中心?
  • 【ACM 出版 |广州市机器人协会主办】2026 机器学习与数据安全学术会议(MLDS 2026) - 爱搞科研的小刘
  • 2026上海贷款中介公司有哪些?上海口碑专业的贷款机构评测 - 速递信息
  • FanControl终极指南:告别BIOS限制,打造个性化风扇控制方案
  • ViTPose模型训练完全指南:从零开始构建高精度姿态估计模型
  • 在Hermes Agent项目中集成Taotoken实现多模型调用与路由
  • 告别Qt在线安装的坑!手把手教你用VSCode+Qt 5.14.2搭建C++ GUI开发环境(附离线包下载)
  • 从手动点击到Python驱动:探索PyFluent如何重新定义CFD工作流自动化
  • STM32 MAX30102 心率血氧测量代码
  • top25-parameter项目贡献指南:如何参与参数库的维护与扩展
  • Linux netstat 命令深度解析:从网络连接到端口监控的完整实现
  • Linux桌面自动化终极指南:10个xdotool高效技巧快速上手
  • 不只是安装:用geemap和本地Jupyter Notebook玩转GEE数据可视化与快速分析
  • AionUi:专为AI应用设计的现代化前端组件库实战指南
  • 【零基础部署】Docker + AnythingLLM 搭建私有知识库保姆级教程
  • 粒子系统与Canvas 2D实现动态喷漆轨迹生成
  • I2C总线设计实战:从物理层到协议层,解决多设备挂载与信号完整性问题
  • 构建Telegram与私有AI模型桥接器:从原理到工程实践
  • 倒置荧光显微镜生产厂家有哪些 - 实了个验
  • 终极AMD Ryzen硬件调试指南:5分钟掌握SMU Debug Tool实战技巧
  • 用C++和Eigen库手把手实现UR3机械臂逆解(附完整代码与避坑指南)
  • 图片换背景在线制作怎么操作?一文解析2026年最好用的免费工具
  • 2026 年 5 月最新天津离婚律所测评,坚守抚养权底线 - 速递信息
  • d2s-editor:暗黑破坏神2存档编辑器的现代化Web解决方案
  • 深入解析Noah-MP陆面模型:从科学原理到实战部署