Monkey and Banana (hdu 1069)

http://acm.hdu.edu.cn/showproblem.php?pid=1069

题目描述:

给你n个箱子, 给你箱子的长宽高,箱子是可以无限使用的,问这些箱子摞起来最多能多高? 这些箱子摞起来有个规定,下面箱子的长和宽必须大于上面箱子的长和宽。

DP思路:dp[i]  代表第  i  个箱子在最上方的时候所摞起来的最大高度。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

#define EPS 1e-6
#define INF 0x3f3f3f3f
#define N 1000
#define met(a,b) (memset(a,b,sizeof(a)))

struct Box
{
    int L, W, H;
    Box(int LL=0, int WW=0, int HH=0):L(LL), W(WW), H(HH)
    {
        if(L>W) swap(L, W);
    }
    bool friend operator < (Box n1, Box n2)
    {
        if(n1.L != n2.L)
            return n1.L > n2.L;
        else if(n1.W != n2.W)
            return n1.W > n2.W;
        return n1.H > n2.H;
    }
}a[N];

int dp[N];

int main()
{
    int n, iCase=1;

    while(scanf("%d", &n), n)
    {
        int i, j, x, y, z, k=0, Max = 0;

        met(a, 0);
        met(dp, 0);

        for(i=0; i<n; i++)
        {
            scanf("%d%d%d", &x, &y, &z);
            a[k++] = Box(x, y, z);
            a[k++] = Box(x, z, y);
            a[k++] = Box(y, z, x);
        }

        sort(a, a+k);

        for(i=0; i<k; i++)
        {
            dp[i] = a[i].H;
            for(j=0; j<i; j++)
            {
                if(a[i].L<a[j].L && a[i].W<a[j].W)
                    dp[i] = max(dp[i], dp[j] + a[i].H);
            }
            Max = max(Max, dp[i]);
        }

        printf("Case %d: maximum height = %d\n", iCase++, Max);
    }
    return 0;
}
时间: 2024-10-28 10:30:51

Monkey and Banana (hdu 1069)的相关文章

hdu 1069 Monkey and Banana(记忆搜)

题意: N(不超过30)种木块,每种木块有长.宽.高x,y,z. 木块A可以搭在木块B上当且仅当A的底面长和宽都分别小于B的顶面的长与宽,即不能有超出B的部分. 问垒起来的“木块塔”的最大高度. 思路: 每种木块有6种形态,所以总共有6*N种木块,列张二维关系表,然后记忆搜. 代码: struct node{ int x,y,z; } b[355]; int dp[355]; int c; bool mp[355][355]; int dfs(int x){ if(dp[x]!=-1) retu

hdu(1069)——Monkey and Banana(LIS变形)

题意: 现在给你n个石块,然后它由坐标来表示(x,y,z).但是它可以有不同的方法,也就是说它的三个坐标可以轮换着来的. 石块的数量不限,但是每次都必须保持上底面的长和宽严格递减,然后问你用这些石块所能拼成的最大高度是多少. 思路: 因为坐标有多种情况,所以我们可以把每次的情况都存下去. 这里需要注意的是,在保存的时候,我们要保持x的坐标是大于y的,这样方便我们之后的排序. 然后就直接求最长递减子序列就好了. #include<stdio.h> #include<string.h>

Valentine&#39;s Day Round 1001.Ferries Wheel(hdu 5174)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1]<A[i]<A[i+1](1<i<K).现在要求的是,有多少人满足,(他坐的缆车的值 + 他左边缆车的值) % INT_MAX == 他右边缆车的值. 首先好感谢出题者的样例三,否则真的会坑下不少人.即同一部缆车可以坐多个人.由于缆车的值是唯一的,所以可以通过排序先排出缆车的位置.求出

最短路 (HDU 2544)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28836    Accepted Submission(s): 12480 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

BestCoder Round #70 Jam&#39;s math problem(hdu 5615)

Problem Description Jam has a math problem. He just learned factorization. He is trying to factorize ax^2+bx+cax?2??+bx+c into the form of pqx^2+(qk+mp)x+km=(px+k)(qx+m)pqx?2??+(qk+mp)x+km=(px+k)(qx+m). He could only solve the problem in which p,q,m,

RPG的错排 (HDU 2068)

RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6746    Accepted Submission(s): 2738 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

字典树 Trie (HDU 1671)

Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergency 911 2. Alice 97 625 999 3. Bob 91 12 54 26 In this

BestCoder Round #1 1002 项目管理 (HDU 4858)

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 260 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值. 现在我