题目链接: [Monkey and Banana]
大致题意:
给你n种长方体,计算最高能堆多高(要求位于上面的长方体的长要大于下面长方体的长,上面长方体的宽大于下面长方体的宽)
解题思路:
相当于最长有序子序列
一种长方体有六种摆法,但通过长宽排序后,还有三种摆法,将所有的摆法先按长后按宽从小到大排序,然后就是最长有序子序列的思路了
dp[i]表示前i种摆法的最大高度
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
struct node {
int l, w, h;
}a[100];
int dp[100];
bool cmp(node p, node q) {
if (p.l == q.l)return p.w < q.w;
return p.l < q.l;
}
int main(void)
{
int t = 1;
int n, l, w, h, cnt;
while (scanf("%d", &n), n) {
cnt = 0;
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &l, &w, &h);
a[cnt].h = l; a[cnt].l = w > h ? w : h; a[cnt++].w = w > h ? h : w;
a[cnt].h = w; a[cnt].l = l > h ? l : h; a[cnt++].w = l > h ? h : l;
a[cnt].h = h; a[cnt].l = l > w ? l : w; a[cnt++].w = l > w ? w : l;
}
sort(a, a + cnt, cmp);
dp[0] = a[0].h;
int maxx;
for (int i = 1; i < cnt; ++i) {
maxx = 0;
for (int j = 0; j < i; ++j) {
if (a[j].l < a[i].l && a[j].w < a[i].w) maxx = max(maxx, dp[j]);
}
dp[i] = maxx + a[i].h;
}
cout << "Case " << t++ << ": maximum height = " << *max_element(dp, dp + cnt) << endl;
}
return 0;
}