清风莫追 2022-10-17 14:42 采纳率: 66.7%
浏览 99
已结题

以最小的步骤收集所有硬币,如何证明该分治算法的正确性?

目录

  • 题目
  • 问题

题目

最小步骤收集硬币
有许多相邻排列的硬币堆。我们需要以最少的步骤收集所有这些硬币,在一个步骤中,我们可以收集一个水平线的硬币或垂直线的硬币,收集的硬币应该是连续的。
输入描述
输入第一行整数N表示硬币堆的数量
输入第二行有N个整数分表表示硬币堆的高度
输出描述
采集所有硬币需要最小步骤
样例输入
5
2 1 2 5 1
样例输出
4
解析
第一行表示有五堆硬币,
第二行表示第一堆有两枚硬币,第二堆一枚硬币,依此类推。
取硬币需要4步,如图所示,取硬币的步骤用不同颜色的线段表示。

在这里插入图片描述

问题

参见:https://verytoolz.com/blog/62dc864e1a/

我们可以使用分治法来解决这个问题。我们可以看到,从下方移除水平线总是有益的。假设我们在递归步骤中处理从 l 索引到 r 索引的堆栈,每次我们将选择最小高度,删除那些水平线,之后堆栈将分为两部分,l 到最小值和最小值 + 1 到 r 和我们将在这些子数组中递归调用。另一件事是我们也可以使用垂直线收集硬币,因此我们将在递归调用的结果和 (r - l) 之间选择最小值,因为使用 (r - l) 垂直线我们总是可以收集所有硬币。每次我们调用每个子数组并找到其中的最小值时,解决方案的总时间复杂度将为 O(N2)

为什么从下方移除水平线总是有益的呢

又或者说,为什么在递归调用的结果和 (r - l) 之间选择最小值得到的是原问题的最小值呢?如何保证不会存在其它步数更小的步骤序列?

  • 写回答

2条回答 默认 最新

  • 於黾 2022-10-17 15:31
    关注

    首先你要审题,下方是重力方向,所以下方的硬币数量必然比上方的多,硬币不能悬空
    而取硬币一共就两种取法,要么取一横排,要么取一竖列
    如果先按竖列取,会把最下面的横排截断,所以显然不是最好的方法
    而先按横排取,不会截断其它行列
    那么你不从长的开始取,难道从最短的开始取吗

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月22日
  • 创建了问题 10月17日

悬赏问题

  • ¥15 Qt安装后运行不了,这是我电脑的问题吗
  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法