classSolution{public:intmaxHeight(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 排序+最長(zhǎng)上升子序
先對(duì)每個(gè)長(zhǎng)方體的長(zhǎng)寬高排序
再對(duì)所有長(zhǎng)方體按照(長(zhǎng)寬高)排序
再利用最長(zhǎng)上升子序DP
classSolution{public:intmaxHeight(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;}};