hdu/hdoj 1069 Monkey and Banana

题目大意:给你N种箱子,给出它的长,宽,高;(每种箱子视为无限个)。把箱子叠层起来,问最大能叠多高。但要求的必须在上面一个箱子的长和宽都要比它下面的箱子的长和宽都小。

思路:其实就是求最长的单调递减序列。题目上说每种可以有无限个,那么就把N中类型的箱子都列举出来,全部进行比较。在长和宽的递减下,求最大能得出的最大高度了。


#include <iostream>
#include <algorithm>
using namespace std;
 
typedef struct Block{
    int l;    // 长
    int w;    // 宽
    int h;    // 高  
}Block;
int dp[110];// 当前最长长度
int n;
Block nBlocks[100];
int cnt = 0;
 
// 按升序排列
bool cmp(Block m, Block n)
{
    return (m.l*m.w < n.l*n.w);
}
 
// 如果n放m上面
bool is(Block m, Block n)
{
    return (m.l>n.l && m.w>n.w) || (m.l>n.w && m.w>n.l); 
}
 
int main()
{
  
    int a, b, c;
    int temp;
    while(scanf("%d", &n) && n)
    {
        ++cnt;
        for(int i=0; i<3*n; ++i)
        {
            scanf("%d %d %d", &a, &b, &c);
            //cout << a << " " << b << " " << c << endl;
            nBlocks[i].l=a, nBlocks[i].w=b, nBlocks[i].h=c, ++i;
            nBlocks[i].l=b, nBlocks[i].w=c, nBlocks[i].h=a, ++i;
            nBlocks[i].l=c, nBlocks[i].w=a, nBlocks[i].h=b;
        }
 
        sort(nBlocks, nBlocks+3*n, cmp);
        for (int i=0; i<3*n; ++i)//注意初始化 
            dp[i]= nBlocks[i].h;
        
        for(int i=1; i<3*n; ++i)
        {
            for(int j=0; j<i; ++j)
            {
                if(is(nBlocks[i], nBlocks[j]))
                    dp[i] =max(dp[j]+nBlocks[i].h,dp[i]);
            }
            
        }
        temp = 0;
        for(int i=0; i<3*n; ++i)
        {
            if(dp[i] > temp)
                temp = dp[i];
        }
        printf("Case %d: maximum height = %d\n", cnt, temp);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值