HDU1069:Monkey and Banana(最长上升子序列的应用)

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

这题挺简单的,给定一个箱子的长宽高,要求啰箱子,但必须保证下面箱子的长和宽必须大于上面的箱子。

一个箱子,有六种情况,排序后,按照最长上升子序列来求解就行了。

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,tt,dp[210];
struct node
{
    int x,y,z;
} q[210];
int cmp(const void *aa,const void *bb)
{
    struct node *a=(struct node *)aa;
    struct node *b=(struct node *)bb;
    if(a->x!=b->x)
        return b->x-a->x;
    else if(a->y!=b->y)
        return b->y-a->y;
    else return b->z-a->z;
}
int main()
{
    int K=0;
    int xx,yy,zz;
    int maxx;
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        ++K;
        tt=1;
        maxx=-inf;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&xx,&yy,&zz);
            q[tt].x=xx;
            q[tt].y=yy;
            q[tt++].z=zz;

            q[tt].x=xx;
            q[tt].y=zz;
            q[tt++].z=yy;

            q[tt].x=yy;
            q[tt].y=xx;
            q[tt++].z=zz;

            q[tt].x=yy;
            q[tt].y=zz;
            q[tt++].z=xx;

            q[tt].x=zz;
            q[tt].y=xx;
            q[tt++].z=yy;

            q[tt].x=zz;
            q[tt].y=yy;
            q[tt++].z=xx;
        }
        qsort(q+1,tt+1,sizeof(q[1]),cmp);
        memset(dp,0,sizeof(dp));
        dp[1]=q[1].z;
        maxx=max(maxx,q[1].z);
        for(int i=2;i<tt;i++)
        {
            for(int j=1;j<i;j++)
            {
                if(q[i].x<q[j].x&&q[i].y<q[j].y)
                {
                    dp[i]=max(dp[i],dp[j]);
                }
            }
            dp[i]=dp[i]+q[i].z;
            maxx=max(maxx,dp[i]);
        }
        printf("Case %d: maximum height = %d\n",K,maxx);
    }
    return 0;
}
时间: 2024-08-30 11:21:53

HDU1069:Monkey and Banana(最长上升子序列的应用)的相关文章

HDU1069 Monkey and Banana 【DP】

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7816    Accepted Submission(s): 4028 Problem Description A group of researchers are designing an experiment to test the IQ of a

HDU1069 Monkey and Banana 简单dp

题意: 把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短: 求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2).(2,1,3)等). /* *********************************************** Author :devil Created Time :2015/12/7 20:38:42 ************************************************

[HDU1069]Monkey and Banana

题目大意:给你$n$种长方体,要你用这些长方体从下往上叠起来,下面的长方体的长和宽要严格大于上面的.求出最高能搭多高. 思路:先得出可以使用的长方体(长>宽,注意高也可以作为一条长或宽,那么一个长方体至少有3种不同的长宽高),然后根据长排序,接着DP就行了. 具体见代码. C++ Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct cft{

HDU1069 Monkey and Banana(dp)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:给定n种类型的长方体,每个类型长方体无数个,要求长方体叠放在一起,且上面的长方体接触面积要小于下面,长宽也小于下面的长方体,求最高能叠放多高? 思路:首先每个长方体有三种情况可以作为底部,那么一共是3*n种类型的长方体,首先按长宽的大小排序,然后dp.dp[i]表示以第i块长方体为顶的最大高度,那么转移方程就是dp[i] = max(dp[i],dp[j] +  g[i]. h),形似一个L

VJ - dp - Monkey and Banana - 最长单调序列

https://vjudge.net/contest/353156#problem/A 一开始想着按背包做 = = 我的dp还是太菜了 应该按照单调序列做 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 struct node{ 6 int l; 7 int s; 8 int v; 9 int ans; 10 node(){ 11 ans

(hdu step 3.2.6)Monkey and Banana(在第一关键字有序的情况下,根据第二关键字求最长上升子序列的高度之和)

题目: Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 720 Accepted Submission(s): 455   Problem Description A group of researchers are designing an experiment to test the IQ of a m

基础dp C Monkey and Banana (类最长上升子序列)

题目大意:有一个猴儿和一些种类的箱子,每种类箱子有各自的长宽高,数目有无限个.猴子想把箱子尽可能的堆积起来, 堆积的条件通俗的讲就是放在下面的箱子能够撑得住上面的箱子,按数学建模来说就是放在下面的箱子的长和宽要比放在上 面的要大(严格大于):由于每种箱子虽然数量是无限的,但是肯定不能同种箱子直接累积,因为那样底面的边长就相等了, 这样就是不合法的了,所以每种箱子可以转换成六种情况的不同箱子(分别作为长宽高),之后就是个最长满足条件的高度序 列就行了,即套用最长上升子序列算法思想即可. #incl

ACM-经典DP之Monkey and Banana——hdu1069

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6984    Accep

最长上升子序列(LIS经典变型) dp学习~5

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10875    Accepted Submission(s): 5660 Problem Description A group of researc