2023-03-28:有一根长度为 n 个单位的木棍,棍上从 0 到 n 标记了若干位置。
给你一个整数数组 cuts ,其中 cuts[i] 表示你需要将棍子切开的位置,
你可以按顺序完成切割,也可以根据需要更改切割的顺序,
每次切割的成本都是当前要切割的棍子的长度,切棍子的总成本是历次切割成本的总和。
对棍子进行切割将会把一根木棍分成两根较小的木棍,
这两根木棍的长度和就是切割前木棍的长度。
返回切棍子的最小总成本。
输入:n = 9, cuts = [5,6,1,4,2]。
输出:22。

答案2023-03-28:

步骤如下:

1.将切割点数组 cuts 排序,并构建新的数组 arr,将 0 和 n 加入其中,得到长度为 m+2 的数组。

2.初始化一个 m+2 行 m+2 列的 DP 数组 dp,dp[i][j] 表示将区间 [i,j] 内的木棍切割成最小块的总成本。初始化值为 -1。

3.定义递归函数 process(arr, l, r, dp),表示计算将 arr[l…r+1] 这段木棍切割成若干小块的最小总成本。

4.在 process 函数中,分三种情况讨论:

当 l > r 时,说明该区间内没有木棍需要切割,返回 0。

当 l == r 时,说明该区间只有一根木棍,成本为该木棍的长度。

当 dp[l][r] != -1 时,说明该区间的最小成本已经被计算过,直接返回结果 dp[l][r]。

5.在 process 函数中,枚举所有可能的切割点 k,计算将 arr[l…k] 和 arr[k+1…r+1] 两段木棍切割成最小块的总成本,并加上当前区间的长度(即 arr[r+1]-arr[l-1]),得到该切割点下的总成本。取最小值作为答案。

6.将答案缓存到 dp[l][r] 中,并返回结果。

7.在主函数中,调用 min_cost(n, &cuts) 函数,得到切割最小总成本。

该算法的时间复杂度为 O(n ^ 3),空间复杂度为 O(n^2)。其中,nn 表示初始木棒的长度,即 n 变量的值。

时间复杂度分析:

在递归函数中,共有 n 个区间需要计算最小成本,对于每个区间,枚举所有可能的切割点需要 O(n) 的时间复杂度,因此总时间复杂度为 O(n^3)。

空间复杂度分析:

DP 数组的大小为 (n+1)×(n+1),因此空间复杂度为 O(n^2)。同时,在递归过程中,由于使用了备忘录技巧,栈深度最大为 O(n),因此空间复杂度也可以看作是 O(n) 级别的。

rust代码如下:

// 计算给定切割点下的最小成本
fn min_cost(n: i32, cuts: &[i32]) -> i32 {
let m = cuts.len();
// 将切割点排序并构建数组
let mut arr = vec![0; m + 2];
arr[0] = 0;
for i in 1..=m {
arr[i] = cuts[i - 1];
}
arr[m + 1] = n;
// 初始化 DP 数组
let mut dp = vec![vec![-1; m + 2]; m + 2];
process(&arr, 1, m, &mut dp)
} // 递归函数,计算给定区间的最小成本
fn process(arr: &[i32], l: usize, r: usize, dp: &mut Vec<Vec<i32>>) -> i32 {
// 如果区间为空,则成本为 0
if l > r {
return 0;
}
// 如果区间只有一个元素,则成本为该元素的长度
if l == r {
return arr[r + 1] - arr[l - 1];
}
// 如果 DP 数组中已经计算过当前区间的最小成本,则直接返回结果
if dp[l][r] != -1 {
return dp[l][r];
}
// 枚举所有可能的切割点,计算最小成本
let mut ans = i32::max_value();
for k in l..=r {
ans = min(ans, process(arr, l, k - 1, dp) + process(arr, k + 1, r, dp));
}
// 加上当前区间的长度,并将结果缓存到 DP 数组中
ans += arr[r + 1] - arr[l - 1];
dp[l][r] = ans;
// 返回最终结果
ans
} fn main() {
let n = 7;
let cuts = [1, 3, 4, 5];
let cost = min_cost(n, &cuts);
println!("{}", cost); // 输出:16
}

2023-03-28:有一根长度为 n 个单位的木棍,棍上从 0 到 n 标记了若干位置。 给你一个整数数组 cuts ,其中 cuts[i] 表示你需要将棍子切开的位置, 你可以按顺序完成切割,也可的更多相关文章

  1. 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)

    45.雅虎(运算.矩阵): 2.一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值 比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4 ...

  2. 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。

    比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6} m=3 所以m的最大值为3. bool isShare(int* ...

  3. 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  4. Contest2071 - 湖南多校对抗赛(2015.03.28)

    Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.csu.edu.cn/OnlineJudge/contest.php?c ...

  5. http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html

    http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html

  6. iOS 学习笔记 六 (2015.03.28)常见错误

    2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' ob ...

  7. 2018.03.28 python-pandas groupby使用

    groupby 分组统计 1.根据某些条件将数据分组 2.对每个组独立应用函数 3.将结果合并到一个数据结构中 Dataframe在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结 ...

  8. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

  9. 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,

    转自:http://www.cnblogs.com/ranranblog/p/5845010.html 风口之下,猪都能飞.当今中国股市牛市,真可谓“错过等七年”. 给你一个回顾历史的机会,已知一支股 ...

  10. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复 用一个ArrayList存储1到100然后随机产生0到arraylist.size()之间的数字作为下标然后从arrayli ...

随机推荐

  1. maven常用镜像源

    <mirrors> <mirror> <id>ibiblio</id> <mirrorOf>central</mirrorOf> ...

  2. decay_rate, decay_steps ,batchsize,iteration,epoch

    (96条消息) decay_rate, decay_steps ,batchsize,iteration,epoch_hellocsz的博客-CSDN博客_decay_steps (1)batchsi ...

  3. mysql对汉字排序

    问题: 编写order by排序时,如果字段是汉字的话,排序会失效. 如: SELECT * FROM user ORDER BY age ASC,username DESC 此时按照username ...

  4. [BUUCTF]HCTF 2018WarmUp1 write up

    ctrl+U查看源代码, 如下: 访问提示中的source.php文件 发现显示了源码,且存在另一个PHP文件hint.php(提示.php),先查看文件内是否有信息 用file来传参,并且要绕过wh ...

  5. rename基本操作

    电脑是Macbook, 用Homebrew先安装rename. 如果没安装Homebrew 直接复制到terminal中回车, 时间稍长. ruby -e "$(curl -fsSL htt ...

  6. 禅道 docker 部署

    官方文档:https://hub.docker.com/r/idoop/zentao 1.创建本地目录:mkdir -p /data/zbox 2.启动容器: sudo docker run -itd ...

  7. React数字滚动组件 numbers-scroll

    数字滚动组件,也可以叫数字轮播组件,这个名字一听就是非常普通常见的组件,第一反应就是想找找网上大佬的东西顶礼膜拜一下,这一搜,还真是没找到趁手的╮(╯▽╰)╭. 最近接了大屏的需求,数字滚动肯定是免不 ...

  8. 给我一块画布,我可以造一个全新的跨端UI

    一.源起   作者是名超大龄程序员,曾涉及了包括Web端.桌面端.移动端等各类前端技术,深受这些前端技术的苦,主要但不限于: 每种技术编写代码的语言及技术完全不同,同样呈现形式的组件各端无法通用: 大 ...

  9. day05-2-yaml

    yaml 1.yaml介绍 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发这种语言时,YAML的意思其实是 ...

  10. CF309E 题解

    11:30,过题.12:50,忘记做法. 吃饭时不该看未来日记的,Ynoj 害人不浅(确信). 以上为个人吐槽. 题目大意 不知道题目翻译是个啥...但讨论区有大佬给出了精确的翻译.我改得符合题目背景 ...