DP17 信封嵌套
描述
给 n 个信封的长度和宽度。如果信封 a 的长和宽都小于信封 b ,那么信封 a 可以放到信封 b 里,请求出信封最多可以嵌套多少层。
数据范围: ,
要求:空间复杂度 ,时间复杂度
要求:空间复杂度 ,时间复杂度
输入描述:
第一行输入一个正整数 n ,表示信封的数量
后续 n 行每行输入两个正整数表示信封的长度和宽度
输出描述:
输出最多可以嵌套的层数
示例1
输入:
9
3 4
2 3
4 5
1 3
2 2
3 6
1 2
3 2
2 4
复制
输出:
4
复制
说明:
从里到外是 (1,2) (2,3) (3,4) (4,5)
示例2
输入:
2
1 4
4 1
输出:
1
题解
动态规划解法
步骤:
- 先将输入数据进行升序排序
- 求出排序后的数组的最长上升子序列
代码如下:
#include <bits/stdc++.h>
int solve(std::vector<std::pair<int, int>> &v)
{
std::sort(v.begin(), v.end(), [](const std::pair<int, int> &a, const std::pair<int, int> &b)
{
if (a.first != b.first)
{
return a.first < b.first;
}
return a.second < b.second; });
std::vector<int> dp(v.size(), 1);
int len = 1;
for (int i = 1; i < v.size(); ++i)
{
for (int k = i - 1; k >= 0; --k)
{
if (v[i].first > v[k].first && v[i].second > v[k].second)
{
dp[i] = std::max(dp[i], dp[k] + 1);
}
}
len = std::max(len, dp[i]);
}
return len;
}
int main()
{
int n;
std::cin >> n;
std::vector<std::pair<int, int>> v(n);
while (n-- >= 0)
{
std::cin >> v[n].first >> v[n].second;
}
std::cout << solve(v) << std::endl;
return 0;
}