• HDU-1069 Monkey and Banana


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

    题意:n种长方形木块,长宽高x,y,z,要求叠放要按照长宽严格递减(不能相等),问最高能叠多高

    思路:由于一种木块有三种叠放方式,所以一种木块要复制成三份加入待选集合中,不妨让x为长,y为宽,z为高,问题就演变成取木块,使x为下降序列,y也为下降序列,且z的和最大,联系到胖老鼠那题这就是裸题了啊,先给x排序,使x为下降序列,然后对这个序列求y的最长下降子序列。最长下降子序列可参考这题

    代码

     1 #include<bits/stdc++.h>
     2 // #include<iostream>
     3 // #include<cstdio>
     4 // #include<cmath>
     5 #define inf 0x3f3f3f3f
     6 using namespace std;
     7 
     8 typedef long long ll;
     9 typedef long double ld;
    10 
    11 const int M = int(1e5)*3 + 5;
    12 const int mod = 10056;
    13 
    14 inline int lowbit(int x) {
    15     return x & (-x);
    16 }
    17 
    18 struct node{
    19     ll x,y,z;
    20 };
    21 vector<node> v;
    22 
    23 int n,kase;
    24 ll ans;
    25 ll dp[M];
    26 
    27 void add(int& x,int& y,int& z){
    28    if(x>y) swap(x,y);
    29    if(y>z) swap(y,z);
    30    if(x>y) swap(x,y);
    31    v.push_back({z,y,x});
    32    v.push_back({z,x,y});
    33    v.push_back({y,x,z});
    34 }
    35 bool cmp(node a,node b){
    36     return a.x==b.x?a.y>b.y:a.x>b.x;
    37 }
    38 int main(){
    39     while(cin>>n && n){
    40         ans=0;
    41         v.clear();
    42 
    43         while(n--){
    44             int x,y,z;
    45             cin>>x>>y>>z;
    46             add(x,y,z);
    47         }
    48 
    49         sort(v.begin(),v.end(),cmp);
    50         // printf(" x   y   z 
    ");
    51         // for(auto x:v) printf("%3d %3d %3d
    ",x.x,x.y,x.z);
    52 
    53         int N=v.size();
    54         for(int i=0;i<N;i++) dp[i]=v[i].z;
    55 
    56         for(int i=0;i<N;i++){
    57             // printf("%d:%d %d %d
    ",i,v[i].x,v[i].y,v[i].z);
    58             for(int j=i-1;j>=0;j--){
    59                 // printf("	%d:%d %d %d",j,v[j].x,v[j].y,v[j].z);
    60                 if(v[i].x<v[j].x && v[i].y<v[j].y){
    61                     dp[i]=max(dp[i],dp[j]+v[i].z);
    62                 }
    63                 // printf(" %d
    ",dp[j]);
    64             }
    65         }
    66 
    67         for(int i=0;i<N;i++){
    68             ans=max(ans,dp[i]);
    69         }
    70 
    71         printf("Case %d: maximum height = %d
    ",++kase,ans);
    72     }
    73     return 0;
    74 }

    备注:难点是想到一种木块有三种摆法,我想到了六种摆法

  • 相关阅读:
    作业4
    PSP记录个人项目耗时
    代码复审
    是否需要有代码规范?
    作业二(1)
    作业二(2)
    作业一
    软件工程学期总结
    作业4
    作业3(PSP表格)
  • 原文地址:https://www.cnblogs.com/harutomimori/p/11287500.html
Copyright © 2020-2023  润新知