Think:
1知识点:基础dp
2题意:询问n种箱子在满足
1>可以不同面为底
2>一个叠一个
3>叠的箱子中上面的箱子长和宽都分别严格小于下面的箱子的长和宽
4>无限个箱子
条件下能够叠的最高高度
以下为Accepted代码——基础dp
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
int x, y, z;
int w;
bool operator < (const Node &b) const{
return w < b.w;
}
}link[114];
int tp, dp[114];
/*dp[i]:表示前i个状态的最高高度*/
int main(){
int k = 1, n, i, j, x, y, z, ans, mv;
while(scanf("%d", &n) && n){
tp = 0;
for(i = 1; i <= n; i++){
scanf("%d %d %d", &x, &y, &z);
link[tp].x = x, link[tp].y = y, link[tp].z = z, link[tp].w = max(x, y), tp++;
link[tp].x = x, link[tp].y = z, link[tp].z = y, link[tp].w = max(x, z), tp++;
link[tp].x = y, link[tp].y = z, link[tp].z = x, link[tp].w = max(y, z), tp++;
}
sort(link, link+tp);
for(i = 0; i < tp; i++)
dp[i] = link[i].z;
ans = 0;
for(i = 1; i < tp; i++){
mv = 0;
for(j = i-1; j >= 0; j--){
if((link[i].x > link[j].x && link[i].y > link[j].y) || (link[i].x > link[j].y && link[i].y > link[j].x)){
if(mv < dp[j])
mv = dp[j];
}
}
dp[i] += mv;
ans = max(ans, dp[i]);
}
printf("Case %d: maximum height = %d\n", k++, ans);
}
return 0;
}