hdu1069 Monkey and Banana

2019-04-14 16:40发布

http://acm.hdu.edu.cn/showproblem.php?pid=1069 一道经典的DP题目,类似于求最长递增子序列吧。 题意: 一堆科学家研究猩猩的智商,给他n个长方体, 然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉。 现在给你n个长方体,计算,最高能堆多高。 要求位于上面的长方体的长要大于(注意不是大于等于)下面长方体的长,上面长方体的宽大于下面长方体的宽。 解题: 一个长方体,可以有6种不同的摆法。 例如: 第一个例子: 10 20 30 它有6中摆法: 长  宽    高 10  20  30 20  30  10 30  10  20 10  30  20 20  10  30 30  20  10 然后我们把它排序 排序之后应该是这样的 10 20 30 10 30 10 20 10 30 20 30 10 30 10 20 30 20 10 因为数据中 长方体种类最多30种,也就是说数组最大可以开到 30*6=180 完全可以 然后用dp[i]来存,到第i个木块,最高可以累多高。 当然,长方体先要以长度排序,长度相同则宽度小的在上。 这道题有点难理解 代码: #include #include using namespace std; struct Cuboid //类 { int l,w,h; } cd[181]; int dp[181]; bool cmp( Cuboid cod1,Cuboid cod2 ) { if( cod1.l==cod2.l ) return cod1.w>n && n ) { len=0; // 每组数都可以变换为6种长方体 for(i=0;i>z1>>z2>>z3; //输入3个数,不知道哪个是长宽高, cd[len].l=z1,cd[len].w=z2,cd[len++].h=z3;//l是长,w是宽,h是高 cd[len].l=z1,cd[len].w=z3,cd[len++].h=z2; cd[len].l=z2,cd[len].w=z1,cd[len++].h=z3; cd[len].l=z2,cd[len].w=z3,cd[len++].h=z1; cd[len].l=z3,cd[len].w=z1,cd[len++].h=z2; cd[len].l=z3,cd[len].w=z2,cd[len++].h=z1; } sort(cd,cd+len,cmp); dp[0]=cd[0].h;// 构建dp数组 int max_h; for(i=1;idp[j]?max_h:dp[j]; //比较大小 } dp[i]=cd[i].h+max_h; //高度 } // 再次搜索 所有dp中最大值 max_h=0; for(i=0;i