Contents
Problem
Solution
積木可隨意旋轉,先將長寬高排序好後,可以歸納出 3 種可能:
(以 1 2 3 表其相對大小)
長    寬    高
1    2    3
1    3    2
2    3    1  
當然也可以直接存其 6 種組合。
接著排序所有積木,要可以疊在上面它的長和寬必定小於下面的長和寬,所以可先用:
bool operator<(const Block& b)
{
    if (len[0] == b.len[0])
        return len[1] < b.len[1];
    else
        return len[0] < b.len[0];
}
排出先後關係。
最後再做 LIS 時用條件判斷即可:
if (blocks[i].len[0] < blocks[j].len[0] && blocks[i].len[1] < blocks[j].len[1])
    hight[j] = max(hight[j], hight[i] + blocks[j].len[2]);
Code
| 1 | 
 |