0
点赞
收藏
分享

微信扫一扫

[动态规划]DP17 信封嵌套-中等

​​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

题解

动态规划解法

步骤:

  1. 先将输入数据进行升序排序
  2. 求出排序后的数组的最长上升子序列

代码如下:

#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;
}

举报

相关推荐

0 条评论