题目链接:hdu1069 代码: //one block could only be placed on top of another block as long as the two base dimensions of the // upper block were both strictly smaller than the corresponding base dimensions of the lower block //write a program that determines the height of the tallest tower the monkey can build with a given set of blocks //The maximum value for n is 30. an unlimited supply of blocks of each type //"Case case: maximum height = height". Case 1: maximum height = 40 #include <iostream> #include <algorithm> using namespace std; struct blocks { int x,y,z; }block[100]; int cmp(blocks a,blocks b) { if(a.x!=b.x)return a.x<b.x; if(a.y!=b.y)return a.y<b.y; return a.z<b.z; } int solve(int t) { int i,j,k,maxh=0,temp,flag; for(i=1;i<t;i++) { temp=0; for(j=0;j<i;j++) { if(block[j].x<block[i].x&&block[j].y<block[i].y) { if(temp<block[j].z)temp=block[j].z;//找到该层中适合条件的最大的高 } } block[i].z+=temp; } for(i=1;i<t;i++) if(maxh<block[i].z)maxh=block[i].z; return maxh; } int main() { //freopen("hdu1069in.txt","r",stdin); //freopen("hdu1069out.txt","w",stdout); int n,cnt=0; while(scanf("%d",&n)!=EOF&&n) { int t,x,y,z,i; for(i=0;i<3*n;i++) { scanf("%d%d%d",&x,&y,&z); if(x>y){t=x;x=y;y=t;} if(y>z){t=y;y=z;z=t;} if(x>y){t=x;x=y;y=t;}//对x,y,z进行排序 block[i].x=x;block[i].y=y;block[i].z=z;i++; block[i].x=x;block[i].y=z;block[i].z=y;i++; block[i].x=y;block[i].y=z;block[i].z=x; } sort(block,block+3*n,cmp);cnt++; printf("Case %d: maximum height = %d/n",cnt,solve(3*n)); } return 0; }