现有 n 个套娃,每个套娃都有各自的长宽高,如果一个套娃的长宽高都大于另外一个套娃则可以将两个套娃套起来。但由于商家的要求,我们只能将序号小的套娃套进序号大的套娃里,也就是序号小的套娃长宽高尺寸小于序号大的套娃才能实现娃套娃。请问最多可以套几层娃。 输入 第一行为一个整数 n;接下来 n 行,每行三个整数,是按序号由小到大给出的套娃长宽高尺寸。 输出 最多套娃的数量。c++
时间: 2024-02-15 16:03:54 浏览: 143
同样是 LIS 问题,以下是 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Doll {
int h, w, d;
bool operator<(const Doll& other) const {
return h < other.h || (h == other.h && w < other.w) || (h == other.h && w == other.w && d < other.d);
}
};
int max_layers(int n, vector<Doll>& dolls) {
sort(dolls.begin(), dolls.end()); // 按长宽高从小到大排序
vector<int> dp(n, 1); // 初始化为 1
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (dolls[i].h > dolls[j].h && dolls[i].w > dolls[j].w && dolls[i].d > dolls[j].d) {
dp[i] = max(dp[i], dp[j] + 1); // 更新 dp[i]
}
}
}
return *max_element(dp.begin(), dp.end()); // 返回最大值
}
int main() {
int n;
cin >> n;
vector<Doll> dolls(n);
for (int i = 0; i < n; i++) {
cin >> dolls[i].h >> dolls[i].w >> dolls[i].d;
}
int ans = max_layers(n, dolls);
cout << ans << endl;
return 0;
}
```
其中 Doll 是一个结构体,表示每个套娃的长宽高。 `operator<` 用于排序时的比较。
阅读全文