給 n(≤30)種磚塊,每種三維 (x,y,z)。可任意旋轉(任意兩維為底,第三維為高),無限供應。堆疊規則:上層磚塊底面長寬嚴格小於下層對應邊。求最大高度。
3n 種塊,每種無限個 → 但因嚴格遞減,同一朝向最多用一次(否則底面相等無法堆疊)。故可視為從 3n 個塊中選序列。dp[i] 以第 i 塊為底的最大高度。dp[i] = h_i + max{ dp[j] | j < i, l_j > l_i, w_j > w_i }。答案 max(dp[i])。
struct Block { int l, w, h; } b[100];
bool cmp(Block a, Block b) {
if (a.l == b.l) return a.w > b.w;
return a.l > b.l;
}
int main() {
int n, cas=1;
while (scanf("%d", &n) && n) {
int cnt=0;
for(int i=0;i b[i].l && b[j].w > b[i].w)
dp[i] = max(dp[i], dp[j] + b[i].h);
ans = max(ans, dp[i]);
}
printf("Case %d: maximum height = %d\n", cas++, ans);
}
}