//把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长
/*
分析:因为每块积木最多有3个不同的底面和高度,因此先把每块积木看成三种不同的积木,
每种积木只有一个底面和一个高度。n中类型的积木转化为3*n个不同的积木的叠加,
对这3 * n个积木的长边从大到小排序;接下来的问题就是找到一个递减的子序列,
使得子序列的高度和最大即可。
数组dp:dp[i]表示是以第i块积木为顶的塔的最大高度
因此可得状态转移方程:dp[i] = max(dp[i],dp[j] + r[i].z)(满足积木j的底面长和宽都大于积木i的长和宽)
和宽短;求这些长方体能叠加的最高的高度.
*/
# include
# include
# include
using namespace std; struct node { int x; int y; int z; }; struct node r[100010]; bool cmp(node a1,node a2) { if(a1.x!=a2.x) return a1.x>a2.x; return a1.y>a2.y; } int main() { int cas=0; int i,j,n,a,b,c,maxh; int dp[100010]; while(~scanf("%d",&n),n) { for(i=0,j=0; i
=0; j--) { if(r[j].x>r[i].x&&r[j].y>r[i].y) { if(dp[j]+r[i].z>dp[i]) dp[i]=dp[j]+r[i].z; } } if(maxh