思路:动态规划
- 先将数组按照任何一条边降序重排,目的是降低里层循环次数。
- 使用dp一维数组,记录以序号i箱子为项时的最大高度。
- 计算每个箱子i时,在约束条件下,找到所有箱子k,并计算以k为顶最大高度与i的高度之和,取最大值。
- 所有箱子都操作完成后,取dp数组元素最大值
class Solution {
public:
static bool width_bigger( const vector<int> &b1, const vector<int> &b2 ){
return b1[0] > b2[0];
}
int pileBox(vector<vector<int>>& box) {
if (!box.size() || !box[0].size()) return 0;
sort( box.begin(), box.end(), width_bigger );
vector<int> dp( box.size(), 0 );
int max_height = 0;
for ( int i = 0; i < box.size(); i++ ){
dp[i] = box[i][2];
for( int k = i-1; k >= 0; k-- ){
if ( box[k][0] > box[i][0] && box[k][1] > box[i][1] && box[k][2] > box[i][2] ){
dp[i] = dp[i] > box[i][2] + dp[k] ? dp[i] : box[i][2] + dp[k];
}
}
max_height = max_height > dp[i] ? max_height : dp[i];
}
return max_height;
}
};