做的很艰难,还参考了一下别人的。。。。。
子问题是以每个矩形为底的塔的最大高度,所有子问题的解中最大的一个就是原问题的解,其中以某个矩形为底的塔的高度可以由自身高度加上可以放在其上的塔的最大高度得到
#include <iostream> #include <algorithm> #include <cstring> using namespace std; int n; typedef struct { int xi; int yi; int zi; int base; //底面面积 }block; int compare(const void *a,const void *b) //根据底面面积排序 { return (*(block*)a).base - (*(block*)b).base; } int x,y,z; int main() { int count = 0; while(cin>>n) { count++; if(n == 0) break; block *blocks = new block[3*n+1]; int *Height = new int[3*n+1]; int cnt = 1; for(int j = 1; j <= n; j++) //根据高不同扩展出三种砖头 { cin>>x>>y>>z; blocks[3*j-2].base = x*y; blocks[3*j-2].xi = x; blocks[3*j-2].yi = y; blocks[3*j-2].zi = z; blocks[3*j-1].base = x*z; blocks[3*j-1].xi = z; blocks[3*j-1].yi = x; blocks[3*j-1].zi = y; blocks[3*j].base = y*z; blocks[3*j].xi = y; blocks[3*j].yi = z; blocks[3*j].zi = x; } qsort(blocks+1,3*n,sizeof(block),compare); Height[1] = blocks[1].zi; int maxminum = 0; //存放最大值 for(int i = 2; i <= 3*n; i++) //对于每一种底面 { bool find = false;//是否能找到放在当前平面上的砖头 int maxHeight = 0; for(int j = i-1;j >= 1; j--)//寻找能放在上面的砖头 { if(blocks[i].xi > blocks[j].xi && blocks[i].yi > blocks[j].yi ||blocks[i].xi > blocks[j].yi && blocks[i].yi > blocks[j].xi) { if(Height[j] > maxHeight) { maxHeight = Height[j]; find = true; } } } if(find == true) { Height[i] = maxHeight + blocks[i].zi; } else { Height[i] = blocks[i].zi; } if(maxminum < Height[i]) { maxminum = Height[i]; } } cout<<"Case "<<count<<": maximum height = "<<maxminum<<endl; } return 0; }