//把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长 /* 分析:因为每块积木最多有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