HDU 1069 Monkey and Banana (dp, 最长上升子序列)

  • 题目链接: HDU 1069
  • 题意: 给定n个长方体,每个长方体均有长、宽、高. 将这些长方体(可重复使用)叠起来,满足上面的长方体的长宽>下面的长方体的长宽( 长>长,宽>宽,为严格> )的条件下. 问叠出来的高度最高为多少?
  • 解法: 一个长方体可分为6种类型的长方体( 以不同的边为底边 ), 按照长排序后,进行最长上升子序列求解,即可得到答案.
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define repp(i, a, b) for(int i=(b); i>=(a); --i)
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define de(x) cout<< #x << " => " << (x) << endl
#define ms(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int inf = 0x3f3f3f3f;
const double PI=acos(-1);
const double eps=1e-9;
inline void file_put() {
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
}
const int maxn = 300;
int n;
struct node{
    int w, l , h, area;
}p[maxn];
int len = 0;
void add(int x, int y, int z){
    p[len].l = x , p[len].w = y , p[len++].h = z; 
    p[len].l = y , p[len].w = x, p[len++].h = z;
    p[len].l = x , p[len].w = z, p[len++].h = y;
    p[len].l = z , p[len].w = x, p[len++].h = y;
    p[len].l = y , p[len].w = z, p[len++].h = x;
    p[len].l = z , p[len].w = y, p[len++].h = x;
    return ;
}
bool cmp(node a, node b){
    if(a.l != b.l) return a.l < b.l;
    else if(a.w != b.w)return a.w < b.w;
}
int dp[maxn];
int main() {
//  file_put();
    int cas=0;
    while(~scanf("%d", &n), n){
        cout << "Case "<<++cas<<": maximum height = ";
        len = 0;
        int x, y, z;
        ms(dp, 0);
        rep(i, 1, n){
            scanf("%d %d %d", &x, &y, &z) ;
            add(x, y, z);
        }
        sort(p, p+len, cmp);
        rep(i, 0, len-1){
            dp[i] = p[i].h;
            rep(j, 0, i-1){
                if(p[i].l>p[j].l && p[i].w >p[j].w){
                    if(dp[i] < dp[j] + p[i].h){
                        dp[i] = dp[j] + p[i].h;
                    }
                }
            }
        }
        int ans = 0;
        rep(i, 0, len-1){
            ans = max(dp[i], ans);
        }
        cout << ans<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值