zoukankan      html  css  js  c++  java
  • HDU 1069 Monkey and Banana(DP——最大递减子序列)

    题目链接:

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

    题意描述:

    给n块砖,给出其长,宽和高

    问将这n块砖,怎样叠放使得满足以下条件使得高度最高,是多少

    条件:A砖要放在B砖上,必须满足,A的长和宽都同时小于B的长和宽。

    解题思路:

    首先给出的n块砖有6种摆放方法,但是有两两的摆放方式情况下,他们的高是一样的,那么只用选取一种即可,那么一块砖可以有3种摆放方法。

    先将三条边进行一个排序,找出不同高的三种砖记录,再对所有这些砖进行一个排序,之后使用DP思想,让每一块砖作为最顶层的砖,遍历有它之前符合条件的砖,

    每次更新dp数组为新高度即可,最后在dp数组中寻找最大高度即可。

    AC代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<ctype.h>
     5 #include<algorithm>
     6 using namespace std;
     7 const int inf=99999999;
     8 
     9 struct B
    10 {
    11     int c,k,h;
    12 };
    13 struct B b2[2600];
    14 //先按长排,长度相同再按宽排 
    15 int cmp(struct B a,struct B b)
    16 {
    17     if(a.c == b.c) 
    18     return a.k > b.k;
    19     return a.c > b.c;
    20 }
    21 int main()
    22 {
    23     int n,i,j,k,t=1,dp[2610],b1[3];
    24     while(scanf("%d",&n),n != 0)
    25     {
    26         j=0;
    27         for(i=1;i<=n;i++)
    28         {
    29             scanf("%d%d%d",&b1[0],&b1[1],&b1[2]);
    30             sort(b1,b1+3);//先将三条边进行一个排序 
    31             
    32             b2[j].c=b1[1];
    33             b2[j].k=b1[0];
    34             b2[j++].h=b1[2];
    35             
    36             b2[j].c=b1[2];
    37             b2[j].k=b1[1];
    38             b2[j++].h=b1[0];
    39             
    40             b2[j].c=b1[2];
    41             b2[j].k=b1[0];
    42             b2[j++].h=b1[1];
    43         }
    44         /*for(i=0;i<j;i++)
    45             printf("%d %d %d
    ",b2[i].c,b2[i].k,b2[i].h);*/ 
    46         sort(b2,b2+j,cmp);
    47         /*for(i=0;i<j;i++)
    48             printf("%d %d %d
    ",b2[i].c,b2[i].k,b2[i].h);*/
    49         int maxh=-inf;
    50         for(int z=0;z<j;z++)
    51         {
    52             dp[z]=b2[z].h;
    53             for(i=z-1;i>=0;i--)
    54             {
    55                 if(b2[i].c > b2[z].c && b2[i].k > b2[z].k)
    56                     dp[z] = max(dp[z],dp[i] + b2[z].h);
    57             }
    58             if(dp[z]> maxh)
    59             maxh=dp[z];
    60         }
    61         printf("Case %d: maximum height = %d
    ",t++,maxh);
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7642705.html
Copyright © 2011-2022 走看看