大型手机网站制作,乐山做美食推荐的网站,蚌埠网站建设,软件开发外包公司的设计一般多少钱Monkey and Banana HDU - 1069 题意大致是将一个长方体通过旋转#xff0c;使得摞起来的建筑最高。但是必须满足这么一个条件#xff0c;那就是上面的长方体的底面一定要完全被下一个长方体的底面完全覆盖#xff0c;并且要有空位#xff0c;就像楼梯那样。
由于每一个长方… Monkey and Banana HDU - 1069 题意大致是将一个长方体通过旋转使得摞起来的建筑最高。但是必须满足这么一个条件那就是上面的长方体的底面一定要完全被下一个长方体的底面完全覆盖并且要有空位就像楼梯那样。
由于每一个长方体可以任意使用而实际上最多只能被用3次即长方体的3个棱分别为高的情况下。
所以我们就可以针对每一个长方体生成3个不同的体位。然后把它加入数组里面去。这样的话数组里面的长方体就只能被使用一次。
然后我们定义dp[i]代表的是以第i个结尾的塔的最大高度那么状态转移就可以写成
dp[i] max(d[[i],dp[j] h[i]),其中i,j满足第i个长方体的底面一定要被第j个厂房体的底面完全覆盖住 #include iostream
#include cstdio
#include algorithm
#include cstring
using namespace std;
const int MAX 200;
struct P{int a,b,h;P(int a1,int b1,int h1):a(a1),b(b1),h(h1){} P(){ }friend bool operator(P p1,P p2){if(p1.a p2.a) return p1.b p2.b;return p1.a p2.a;}
};
P ps[MAX];
int h[MAX];
int dp[MAX];
int cnt 0;
int x[3];
int main(){int n,cas 0;while(scanf( %d,n) ! EOF n){memset(dp,0,sizeof(dp));cnt 0;for(int i 0;i n;i){scanf( %d %d %d,x[0],x[1],x[2]);sort(x,x3);ps[cnt] P(x[0],x[1],x[2]);ps[cnt] P(x[0],x[2],x[1]);ps[cnt] P(x[1],x[2],x[0]);}sort(ps,pscnt);int ans 0;for(int i 0;i cnt;i){dp[i] ps[i].h;for(int j 0;j i;j){if(ps[i].a ps[j].a ps[i].b ps[j].b){dp[i] max(dp[i],dp[j] ps[i].h);}}ans max(ans,dp[i]);}printf(Case %d: maximum height %d\n,cas,ans); }return 0;
}