标签:des style http java color strong
1 10 20 30 2 6 8 10 5 5 5 7 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0
Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case 4: maximum height = 342
有一堆箱子,有长宽高,x,y,z。 规定:放在上面的箱子,无论长和宽都要比下面的箱子大,只有一边大是不行的。
箱子的方向可以任意放。 这样,x,y,z就有六种组合。其实也可以说是三种(如果要的是面积的大小)。
因为要和上面的箱子比较,这里为了计算方便,直接写成六种。
求的是最大高度。
注意:不是只有一个箱子,而是很多那种规格的箱子,开始以为只有一个,第一个样例就不能解释。
只不过这个情况,我们需要先排下序。把大的箱子放前面。有点牵强的说,也算是用了贪心的思想。
虽然我们不能确定一个x边最大的箱子不一定就能放在最下面,例如的它的y边很小,但是,它肯定也放不到其它箱子的上面,所以,把它放前面也是可以的。
因此可以按x边排序。不过在最后比较的时候,要严格遵循 x1 > x2 && y1 > y2。
#include <iostream> #include <algorithm> using namespace std; #define M 1000 struct node { int x,y,z; }vis[M]; int mat[M]; bool cmp(node a,node b) { if(a.x==b.x) return a.y>b.y; return a.x>b.x; } int main(int a,int b,int c) { int i,j,n,k=0; while(scanf("%d",&n)!=EOF&&n) { memset(mat,0,sizeof(mat)); k++; for(i=0;i<n*6;i+=6) { //箱子的不同放法。 scanf("%d%d%d",&a,&b,&c); { vis[i].x=a; vis[i].y=b; vis[i].z=c; vis[i+1].x=a; vis[i+1].y=c; vis[i+1].z=b; vis[i+2].x=b; vis[i+2].y=a; vis[i+2].z=c; vis[i+3].x=b; vis[i+3].y=c; vis[i+3].z=a; vis[i+4].x=c; vis[i+4].y=a; vis[i+4].z=b; vis[i+5].x=c; vis[i+5].y=b; vis[i+5].z=a; } } sort(vis,vis+n*6,cmp); //排序。 for(i=0;i<n*6;i++) { mat[i]=vis[i].z; //初始情况:只有自己,下面没有垫箱子。 for(j=i-1;j>=0;j--) //从i->0和0->i都可以,因为mat[j]就是第j个箱子在最上面的最优解,这个在循环里已经求过。 { if(vis[i].x<vis[j].x&&vis[i].y<vis[j].y) if(mat[i]<mat[j]+vis[i].z) //找到一个更优解,替换掉原来的解。 { mat[i]=mat[j]+vis[i].z; } } } int max=0; for(i=0;i<n*6;i++) if(max<mat[i]) max=mat[i]; //寻找每一个箱子在最上面的时候的高度最大值。 printf("Case %d: maximum height = %d\n",k,max); } return 0; }
HDU 1069 Monkey and Banana (动规),布布扣,bubuko.com
HDU 1069 Monkey and Banana (动规)
标签:des style http java color strong
原文地址:http://blog.csdn.net/qq2256420822/article/details/38009995