C++ 【填充书架】

填充书架

dp[ i ] = 放下第i 本书的最小高度

递推公式:要放第 i 本书的时候 假定前面有 j 本书在书架上,j<i ,【 j - i 】之间的书作为最上层的,算出最上层书的最小层数

本题的目的是划分成多个子数组,这类问题,我们需要考虑的是子数组中到底要有几个元素从哪里开始划分?
所以我们就可以枚举最后一个子数组中的元素个数,或者枚举最后一个子数组的起点 j,这样最后一个子数组为 nums[j…i],长度为 i-j+1

nums[j…i] 需要满足的条件时,元素(厚度)之和 不超过 shelfWidth

因此,定义 dp[i] 为 nums[0…i] 的所有划分方案中 得到的 所有子数组最大高度之和 的最小值

考虑 最后一个子数组是 nums[j…i],j 是所有可能的起点,且 nums[j…i] 元素(厚度)之和 不超过 shelfWidth

那么接下来考虑 这个 j 是需要从 0 到 i 顺序枚举呢 ? 还是 从 i 到 0 倒序枚举呢?.

对于 dp[i],nums[i] 已经确定是 最后一个元素,如果顺序枚举,没法快速知道 nums[j…i] 的厚度之和,也没法快速得到这部分书的最大高度

而如果 倒序枚举 j 从 i 到 0,用变量 w 记录 nums[i…j] 的元素厚度和,用 h 记录 nums[i…j] 的元素最大高度

class Solution {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值