用c++语言解决题目描述 现有 n 个套娃,每个套娃都有各自的长宽高,如果一个套娃的长宽高都大于另外一个套娃则可以将两个套娃套起来。但由于商家的要求,我们只能将序号小的套娃套进序号大的套娃里,也就是序号小的套娃长宽高尺寸小于序号大的套娃才能实现娃套娃。请问最多可以套几层娃。 输入 第一行为一个整数 n;接下来 n 行,每行三个整数,是按序号由小到大给出的套娃长宽高尺寸。 输出 最多套娃的数量。
时间: 2024-02-21 17:58:47 浏览: 66
以下是用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 && w < other.w && d < other.d;
}
};
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;
}
sort(dolls.begin(), dolls.end());
vector<int> dp(n, 1);
int maxLayers = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (dolls[i] < dolls[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
maxLayers = max(maxLayers, dp[i]);
}
cout << maxLayers << endl;
return 0;
}
```
解析:
首先将所有套娃按照高度从小到大排序,然后使用动态规划求解最多套娃的数量。
定义一个长度为n的dp数组,其中dp[i]表示以第i个娃为最外层娃时最多可以嵌套的层数。初始状态为dp[i]=1,表示第i个娃自己可以当作一层。
接下来,对于第i个娃,遍历所有序号小于i的娃,如果第i个娃可以嵌入第j个娃中(即dolls[i] < dolls[j]),则更新dp[i]的值:dp[i] = max(dp[i], dp[j] + 1)。这里需要取max是因为可能会有多个娃可以嵌入第j个娃中,我们需要选择最多的那个。
最后,dp数组中的最大值即为最多可以嵌套的层数。
时间复杂度为O(n^2),可以通过本题。
阅读全文