Monkey and Banana HDU - 1069 --最大子序列和

题目链接

题目描述
一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
研究人员有n种类型的砖块,每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi,yi,zi来表示。
同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高。在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一些空间让猴子来踩。

你的任务是编写一个程序,计算猴子们最高可以堆出的砖块们的高度。

Input

输入文件包含多组测试数据。

每个测试用例的第一行包含一个整数n,代表不同种类的砖块数目。n<=30.

接下来n行,每行3个数,分别表示砖块的长宽高。

当n= 0的时候,无需输出任何答案,测试结束。

Output

对于每组测试数据,输出最大高度。格式:Case 第几组数据: maximum height = 最大高度

Sample Input​​​​​​​
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342

最长上升子序列模型 -> 最大子序列和

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 7;
 
struct node {
    int l, r, w;
    bool operator<(const node& p) const {
        if (l == p.l)
            return r < p.r;
        return l < p.l;
    }
};
vector<node> v;
int dp[N];
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int n;
    int t = 0;
    while (cin >> n && n) {
        t++;
        v.clear();
        for (int i = 1; i <= n; i++) {
            int a, b, c;
            cin >> a >> b >> c;
            v.push_back({a, b, c});
            v.push_back({a, c, b});
            v.push_back({b, a, c});
            v.push_back({b, c, a});
            v.push_back({c, a, b});
            v.push_back({c, b, a});
        }
        sort(v.begin(), v.end());
        memset(dp, 0, sizeof(dp));
        int ans = 0;  //最长上升子序列模型 -> 最大子序列和
        for (int i = 0; i < v.size(); i++) {
            dp[i] = v[i].w;
            for (int j = 0; j < i; j++) {
                if (v[j].l < v[i].l && v[j].r < v[i].r)
                    dp[i] = max(dp[i], dp[j] + v[i].w);
            }
            ans = max(ans, dp[i]);
        }
        cout << "Case " << t << ": maximum height = " << ans << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值