#### link:https://leetcode.com/problems/maximum-height-by-stacking-cuboids/description/
* 學習找「狀態」
* 通過思考,建一個 dp 表,dp[i] 指的是以第 i 個元素作為底的最大高度
* 因此,我們要先 sort 方塊的長寬高,並且從最小的高度開始看起 => base case ( 這題能這樣做是因為題目限定了上面方塊的長寬高都要比下面的小,所以我們只要把最長的當作高就行了 )
* 基本上經過 sort 之後第一個 ( 或最後一個,看你是升序排列還是降序排列 ) 會是最小的,用那個當 base case,一路往大的方塊漸漸尋訪。( 如果從最大的方塊開始會出問題,這裡我卡了很久 )
```c++=
class Solution {
public:
static bool cmp(int a, int b){
return a > b;
}
static bool cmp1(vector<int> &a, vector<int> &b){
if (a[0] != b[0]) return a[0] > b[0];
else if (a[1] != b[1] ) return a[1] > b[1] ;
else return a[2] > b[2];
}
bool compare(int k, int r, vector<vector<int>> &cuboids, vector<int> &dp){
return (cuboids[r][0] >= cuboids[k][0] && cuboids[r][1] >= cuboids[k][1] && cuboids[r][2] >= cuboids[k][2]);
}
int maxHeight(vector<vector<int>>& cuboids) {
int n = cuboids.size();
for (int i = 0; i < n; i++){
sort(cuboids[i].begin(), cuboids[i].end(), &Solution::cmp);
}
sort(cuboids.begin(), cuboids.end(), &Solution::cmp1);
for (int i = 0; i < n; i++){
int k = 0;
for (int j = 0; j < 3; j++, k++){
cout << cuboids[i][j]<<" ";
}
cout << endl;
}
int m = cuboids[n - 1][0];;
vector<int> dp(n, 0);
for (int i = n - 1; i >= 0; i--){
dp[i] = cuboids[i][0];
for (int j = i+1; j < n; j++){
if (cuboids[i][0] >= cuboids[j][0] && cuboids[i][1] >= cuboids[j][1] && cuboids[i][2] >= cuboids[j][2] ){
dp[i] = max(dp[j] + cuboids[i][0], dp[i]);
}
m = max(dp[i], m);
}
}
return m;
}
};
```