动态规划训练15 [Monkey and Banana HDU

来源:互联网 发布:win10系统优化软件 编辑:程序博客网 时间:2024/05/16 17:06

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,x+3);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,ps+cnt);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;}