我是靠谱客的博主 英勇牛排,最近开发中收集的这篇文章主要介绍力扣(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_1le l_1 le h_1,w_2le l_2 le h_2 w1l1h1,w2l2h2 ,要 A A A 可以堆叠在 B B B 上,当且仅当 w 1 ≤ w 2 w_1le w_2 w1w2 l 1 ≤ l 2 l_1le l_2 l1l2 h 1 ≤ h 2 h_1le h_2 h1h2
证明 :
①满足 w 1 ≤ w 2 w_1le w_2 w1w2 l 1 ≤ l 2 l_1le l_2 l1l2 h 1 ≤ h 2 h_1le 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_1le l_1le h_1 w2<w1l1h1
    仅当 l 1 ≥ l 2 l_1ge l_2 l1l2 h 1 ≥ h 2 h_1ge h_2 h1h2 ,可以堆叠(包含在原命题),( w 1 > w 2 w_1>w_2 w1>w2 l 1 ≥ l 2 l_1ge l_2 l1l2 h 1 ≥ h 2 h_1ge h_2 h1h2
    其他情况不可堆叠。
  2. l 1 > l 2 l_1>l_2 l1>l2
    因为 w 1 ≤ l 1 ≤ h 1 w_1le l_1le h_1 w1l1h1 , w 2 ≤ l 2 ≤ h 2 w_2le l_2le h_2 w2l2h2
    w 2 ≤ l 2 < l 1 ≤ h 1 w_2le l_2 <l_1le 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_2le l_2le h_2<h_1 w2l2h2<h1
    仅当 w 1 ≥ w 2 w_1ge w_2 w1w2 l 1 ≥ l 2 l_1ge 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

致语

  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

最后

以上就是英勇牛排为你收集整理的力扣(LeetCode)1691. 堆叠长方体的最大高度(C++)的全部内容,希望文章能够帮你解决力扣(LeetCode)1691. 堆叠长方体的最大高度(C++)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部