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 }
  • 相关阅读:
    祖传屎山代码
    WebService原理及重要术语
    ML-For-Beginners
    Row Level Security行级数据安全,简称RLS。
    浅析 Dapr 里的云计算设计模式
    讲师征集| .NET Conf China 2021正式启动
    为什么 Dapr 如此令人兴奋
    Open Application Model(OAM)的 Kubernetes 标准实现 Crossplane 项目 成为 CNCF 孵化项目
    kubectl 的插件管理工具krew
    PrimeBlazor 组件以MIT 协议开源
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7642705.html
Copyright © 2011-2022 走看看