力扣(LeetCode)1691. 堆叠长方体的最大高度(C++)

动态规划

pp
状态计算 :
f [ i ] = { c u b o i d s [ i ] [ 2 ] if  不 存 在 k m a x ( f [ k ] ) + c u b o i d s [ i ] [ 2 ] if  k ∈ [ 1 , i − 1 ] f[i] = \begin{cases} cuboids[i][2] &\text{if } 不存在k \\ max(f[k])+cuboids[i][2] &\text{if } k \in [1,i-1] \end{cases} f[i]={cuboids[i][2]max(f[k])+cuboids[i][2]if kif k[1,i1]

其中 c u b o i d s [ i ] [ 2 ] cuboids[i][2] cuboids[i][2] 表示 i i i 的高度。


设长方体 A A A 的宽长高为 w 1 , l 1 , h 1 w_1,l_1,h_1 w1,l1,h1 B B B 的宽长高为 w 2 , l 2 , h 2 w_2,l_2,h_2 w2,l2,h2
解题需要的性质 : 若 w 1 ≤ l 1 ≤ h 1 , w 2 ≤ l 2 ≤ h 2 w_1\le l_1 \le h_1,w_2\le l_2 \le h_2 w1l1h1,w2l2h2 ,要 A A A 可以堆叠在 B B B 上,当且仅当 w 1 ≤ w 2 w_1\le w_2 w1w2 l 1 ≤ l 2 l_1\le l_2 l1l2 h 1 ≤ h 2 h_1\le h_2 h1h2
证明 :
①满足 w 1 ≤ w 2 w_1\le w_2 w1w2 l 1 ≤ l 2 l_1\le l_2 l1l2 h 1 ≤ h 2 h_1\le h_2 h1h2 ,一定是符合题意的堆叠方案。
②要证明仅当,可以反证,假设当 w 1 > w 2 w_1>w_2 w1>w2 l 1 > l 2 l_1>l_2 l1>l2 h 1 > h 2 h_1>h_2 h1>h2 A A A 可以堆在 B B B 上,

  1. w 1 > w 2 w_1>w_2 w1>w2
    w 2 < w 1 ≤ l 1 ≤ h 1 w_2<w_1\le l_1\le h_1 w2<w1l1h1
    仅当 l 1 ≥ l 2 l_1\ge l_2 l1l2 h 1 ≥ h 2 h_1\ge h_2 h1h2 ,可以堆叠(包含在原命题),( w 1 > w 2 w_1>w_2 w1>w2 l 1 ≥ l 2 l_1\ge l_2 l1l2 h 1 ≥ h 2 h_1\ge h_2 h1h2
    其他情况不可堆叠。
  2. l 1 > l 2 l_1>l_2 l1>l2
    因为 w 1 ≤ l 1 ≤ h 1 w_1\le l_1\le h_1 w1l1h1 , w 2 ≤ l 2 ≤ h 2 w_2\le l_2\le h_2 w2l2h2
    w 2 ≤ l 2 < l 1 ≤ h 1 w_2\le l_2 <l_1\le h_1 w2l2<l1h1
    w 2 w_2 w2 l 2 l_2 l2 只能与 w 1 w_1 w1 匹配,
    w 1 w_1 w1 只可匹配其中之一,
    不可以堆叠。
  3. h 1 > h 2 h_1>h_2 h1>h2
    w 2 ≤ l 2 ≤ h 2 < h 1 w_2\le l_2\le h_2<h_1 w2l2h2<h1
    仅当 w 1 ≥ w 2 w_1\ge w_2 w1w2 l 1 ≥ l 2 l_1\ge l_2 l1l2 ,可以堆叠(包含在原命题)
    其他情况不可堆叠。

综上,只有原命题成立,反证的结论才能成立,否则反证不成立。所以原命题成立。

class Solution {
public:
    int maxHeight(vector<vector<int>>& cuboids) {
        for(auto &c:cuboids) sort(c.begin(),c.end());
        sort(cuboids.begin(),cuboids.end());
        int n = cuboids.size();
        vector<int> f(n,0);
        int ans = 0;
        for(int i = 0;i<n;i++){
            f[i] = cuboids[i][2];
            for(int j = 0;j<i;j++)
                if(cuboids[i][1]>=cuboids[j][1]&&cuboids[i][2]>=cuboids[j][2])
                    f[i] = max(f[i],f[j]+cuboids[i][2]);
            ans = max(ans,f[i]);
        }
        return ans;
    }
};
  1. 时间复杂度 : O ( n 2 ) O(n^2) O(n2) n n n 是长方体的数量,状态数量是 n n n ,转移数量是 n n n ,状态转移的时间复杂度 O ( n 2 ) O(n^2) O(n2)
  2. 空间复杂度 : O ( n ) O(n) O(n) ,所有状态的空间复杂度 O ( n ) O(n) O(n)
AC

AC

致语
  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值