算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 俄罗斯套娃信封问题,我们先来看题面:

https://leetcode-cn.com/problems/russian-doll-envelopes/

You are given a 2D array of integers envelopes where envelopes[i] = [wi, hi] represents the width and the height of an envelope.

One envelope can fit into another if and only if both the width and height of one envelope are greater than the other envelope's width and height.

Return the maximum number of envelopes you can Russian doll (i.e., put one inside the other).

Note: You cannot rotate an envelope.

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

示例

示例 1:输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。示例 2:输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

解题

https://blog.csdn.net/qq_35683407/article/details/114373289

这是一道经典的 DP 模型题目:最长上升子序列(LIS)。

首先我们先对 envelopes 进行排序,确保信封是从小到大进行排序。

问题就转化为我们从这个序列中选择 k 个信封形成新的序列,使得新序列中的每个信封都能严格覆盖前面的信封(宽高都严格大于)。

我们可以定义状态 f[i] 为考虑前 i 个物品,并以第 i 个物品为结尾的最大值。

对于每个 f[i] 而言,最小值为 1,代表只选择自己一个信封。

那么对于一般的 f[i] 该如何求解呢?因为第 i 件物品是必须选择的。我们可以枚举前面的 i - 1 件物品,哪一件可以作为第 i 件物品的上一件物品。

在前 i - 1 件物品中只要有符合条件的,我们就使用 max(f[i], f[j] + 1) 更新 f[i]。

然后在所有方案中取一个 max 即是答案。

// 354maxEnvelopes.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//按照特定规则排序
struct rule
{
public:bool operator()(const vector<int>& e1, const vector<int>& e2){return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);}
};
class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) {if (envelopes.size() == 0)return 0;int maxvalue = 0;sort(envelopes.begin(), envelopes.end(), rule());//第一个元素排序vector<int>dp(envelopes.size() + 1,1);//第二个元素按照最长递增子序列LISfor (int i = 0; i < envelopes.size(); i++){for (int j = 0; j < i; j++){if (envelopes[i][1]>envelopes[j][1]){dp[i] = max(dp[i], dp[j] + 1);}}if (dp[i] > maxvalue)maxvalue = dp[i];}return maxvalue;}
};int main()
{Solution s;vector<vector<int>> envelopes = { {4, 5},{4, 6},{6, 7},{2, 3},{1, 1} };cout << s.maxEnvelopes(envelopes) << endl;std::cout << "Hello World!\n";
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-340题汇总,希望对你有点帮助!

LeetCode刷题实战341:扁平化嵌套列表迭代器

LeetCode刷题实战342:4的幂

LeetCode刷题实战343:整数拆分

LeetCode刷题实战344:反转字符串

LeetCode刷题实战345:反转字符串中的元音字母

LeetCode刷题实战346:数据流中的移动平均值

LeetCode刷题实战347:前 K 个高频元素

LeetCode刷题实战348:设计井字棋

LeetCode刷题实战349:两个数组的交集

LeetCode刷题实战350:两个数组的交集 II

LeetCode刷题实战351:安卓系统手势解锁

​LeetCode刷题实战354:俄罗斯套娃信封问题相关推荐

  1. Leetcode刷题笔记 354 俄罗斯套娃

    俄罗斯信封套娃 题目 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都比这个信封大的时候 ...

  2. ​LeetCode刷题实战355:设计推特

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  3. ​LeetCode刷题实战603:连续空余座位

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  4. ​LeetCode刷题实战623:在二叉树中增加一行

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  5. ​LeetCode刷题实战371:两整数之和

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  6. ​LeetCode刷题实战375:猜数字大小 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  7. ​LeetCode刷题实战362:敲击计数器

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  8. ​LeetCode刷题实战450:删除二叉搜索树中的节点

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. ​LeetCode刷题实战546:移除盒子

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. 《GPU高性能编程CUDA实战》中代码整理
  2. SQL Server数据库重命名、数据导出等若干问题
  3. 重磅|施耐德电气O2O数字化咨询服务强势来袭
  4. linux运维最小化安装cacti,Linux监控和安全运维--cacti安装部署
  5. wxWidgets:多线程概述
  6. 把16进制值转换成颜色颜色16进制值表 .
  7. 听小鹏讲废话之OSI
  8. 面试题28:字符串全排列
  9. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(三)密码修改以及密码重置...
  10. 【算法笔记+SGU275+HDU3949】线性基(XOR,求n个数异或得到的第k小的数)
  11. Vuforia+Unity实现AR效果
  12. 易语言 实现程序被关闭时隐藏窗口
  13. python有效的变量名有哪些_python变量名有哪些
  14. 什么是运维工程师?运维工程师应该具备的素质
  15. 三招解决!电脑密码忘记了怎么办?新手都能学会
  16. 远程桌面蓝屏解决办法
  17. 焦距換算倍率(Focal length ratio)
  18. 计算机考研高数范围,考研数学一二三区别(大致考试范围)
  19. 100 篇最受欢迎的 Chat 汇总
  20. 计算机检测维修与数据恢复招标,计算机检测维修与数据恢复实训室企业招标文件.doc...

热门文章

  1. Apache项目下载地址
  2. Unity游戏开发客户端面经——热更新(初级)
  3. 社群运营方案怎么写?
  4. 【微信小程序高频面试题——精选一】
  5. 纪伯伦先知_先知的时间序列分析:航空乘客数据
  6. 由美团技术文章整理---spark性能优化基础篇--开发调优与资源参数调优
  7. 博图region用法_TIA博途软件-STEP 编程指南
  8. 挑逗 Java 程序员的那些 Scala 绝技
  9. 推广营销人员的秘密武器:太阳动态ip代理
  10. SMC 常规型压力传感器/开关(真空/正压)使用说明书 Z/ISE30A