日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)

發(fā)布時間:2024/7/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 暴力超時解
      • 2.2 排序+最長上升子序


463 / 3709,前 12.5%

1240 / 9290,前13.3%

1. 題目

給你 n 個長方體 cuboids ,其中第 i 個長方體的長寬高表示為 cuboids[i] = [widthi, lengthi, heighti](下標(biāo)從 0 開始)。請你從 cuboids 選出一個 子集 ,并將它們堆疊起來。

如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以將長方體 i 堆疊在長方體 j 上。你可以通過旋轉(zhuǎn)把長方體的長寬高重新排列,以將它放在另一個長方體上。

返回 堆疊長方體 cuboids 可以得到的 最大高度

示例 1:

輸入:cuboids = [[50,45,20],[95,37,53],[45,23,12]] 輸出:190 解釋: 第 1 個長方體放在底部,53x37 的一面朝下,高度為 95 。 第 0 個長方體放在中間,45x20 的一面朝下,高度為 50 。 第 2 個長方體放在上面,23x12 的一面朝下,高度為 45 。 總高度是 95 + 50 + 45 = 190 。示例 2: 輸入:cuboids = [[38,25,45],[76,35,3]] 輸出:76 解釋: 無法將任何長方體放在另一個上面。 選擇第 1 個長方體然后旋轉(zhuǎn)它,使 35x3 的一面朝下,其高度為 76 。示例 3: 輸入:cuboids = [[7,11,17],[7,17,11],[11,7,17],[11,17,7],[17,7,11],[17,11,7]] 輸出:102 解釋: 重新排列長方體后,可以看到所有長方體的尺寸都相同。 你可以把 11x7 的一面朝下,這樣它們的高度就是 17 。 堆疊長方體的最大高度為 6 * 17 = 102 。提示: n == cuboids.length 1 <= n <= 100 1 <= widthi, lengthi, heighti <= 100

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-height-by-stacking-cuboids
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

  • 類似題目:
    山谷序列(DP)
    LeetCode 5559. 得到山形數(shù)組的最少刪除次數(shù)(最長上升子序DP nlogn)
    程序員面試金典 - 面試題 17.08. 馬戲團人塔(最長上升子序 DP/二分查找)
    LeetCode 354. 俄羅斯套娃信封問題(最長上升子序 DP/二分查找)
    LeetCode 368. 最大整除子集(DP)
    程序員面試金典 - 面試題 08.13. 堆箱子(DP)
    LeetCode 673. 最長遞增子序列的個數(shù)(DP)
    LeetCode 1027. 最長等差數(shù)列(DP)
    LeetCode 5545. 無矛盾的最佳球隊(最大上升子序DP)

2.1 暴力超時解

  • 復(fù)雜度太高了,超時
class Solution { public:int maxHeight(vector<vector<int>>& cub) {sort(cub.begin(), cub.end(),[&](auto& a, auto& b){return a[0]+a[1]+a[2] < b[0]+b[1]+b[2];});int n = cub.size();vector<vector<vector<int>>> dp(101,vector<vector<int>>(101, vector<int>(101, -1)));dp[0][0][0] = 0;dp[cub[0][0]][cub[0][1]][cub[0][2]] = max(dp[cub[0][0]][cub[0][1]][cub[0][2]],cub[0][2]);dp[cub[0][0]][cub[0][2]][cub[0][1]] = max(dp[cub[0][0]][cub[0][2]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][0]][cub[0][2]] = max(dp[cub[0][1]][cub[0][0]][cub[0][2]],cub[0][2]);dp[cub[0][2]][cub[0][0]][cub[0][1]] = max(dp[cub[0][2]][cub[0][0]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][2]][cub[0][0]] = max(dp[cub[0][1]][cub[0][2]][cub[0][0]],cub[0][0]);dp[cub[0][2]][cub[0][1]][cub[0][0]] = max(dp[cub[0][2]][cub[0][1]][cub[0][0]],cub[0][0]);for(int i = 1; i < n; ++i){vector<vector<vector<int>>> temp(dp.begin(), dp.end());int a = cub[i][0], b = cub[i][1], c = cub[i][2];for(int w = 0; w <= 100; ++w){for(int l = 0; l <= 100; ++l){for(int h = 0; h <= 100; ++h){if(temp[w][l][h] == -1)continue;if(a >= w && b >= l && c >= h)temp[a][b][c] = max(temp[a][b][c], dp[w][l][h]+c);if(b >= w && a >= l && c >= h)temp[b][a][c] = max(temp[b][a][c], dp[w][l][h]+c);if(a >= w && c >= l&& b >= h)temp[a][c][b] = max(temp[a][c][b], dp[w][l][h]+b);if(c >= w && a >= l&& b >= h)temp[c][a][b] = max(temp[c][a][b], dp[w][l][h]+b);if(b >= w && c >=l&& a >= h)temp[b][c][a] = max(temp[b][c][a], dp[w][l][h]+a);if(c >= w && b >=l&& a >= h)temp[c][b][a] = max(temp[c][b][a], dp[w][l][h]+a);}}}dp = temp;}int ans = 0;for(int h = 1; h <= 100; h++)for(int w = 1; w <= 100; ++w){for(int l = 1; l <= 100; ++l){ans = max(ans, dp[w][l][h]);}}return ans;} };

2.2 排序+最長上升子序

  • 先對每個長方體的長寬高排序
  • 再對所有長方體按照(長寬高)排序
  • 再利用最長上升子序DP
class Solution { public:int maxHeight(vector<vector<int>>& cub) {vector<vector<int>> C(6, vector<int>(3));C[0] = {0,1,2};C[1] = {0,2,1};C[2] = {1,0,2};C[3] = {1,2,0};C[4] = {2,0,1};C[5] = {2,1,0};//最后一維是高度維for(auto& c : cub)sort(c.begin(), c.end());sort(cub.begin(), cub.end());int n = cub.size();vector<vector<int>> dp(n, vector<int>(6, 0));dp[0][0] = cub[0][C[0][2]];dp[0][1] = cub[0][C[1][2]];dp[0][2] = cub[0][C[2][2]];dp[0][3] = cub[0][C[3][2]];dp[0][4] = cub[0][C[4][2]];dp[0][5] = cub[0][C[5][2]];for(int i = 1; i < n; ++i){for(int c1 = 0; c1 < 6; ++c1){dp[i][c1] = cub[i][C[c1][2]];//初始化為自己的高度for(int j = 0; j < i; ++j){for(int c2 = 0; c2 < 6; ++c2){ if(cub[j][C[c2][0]] <= cub[i][C[c1][0]]&& cub[j][C[c2][1]] <= cub[i][C[c1][1]]&& cub[j][C[c2][2]] <= cub[i][C[c1][2]]){dp[i][c1] = max(dp[i][c1], dp[j][c2]+cub[i][C[c1][2]]);}}}}}int ans = 0;for(int i = 0; i < n; i++){for(int k = 0; k < 6; k++){ans = max(ans, dp[i][k]);}}return ans;} };

332 ms 9.8 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進步!

總結(jié)

以上是生活随笔為你收集整理的LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。