力扣354. 俄罗斯套娃信封问题

动态规划

  • 思路:
    • 同时控制 w、h 两个维度比较复杂,可以先固定一个维度,来找出另外一个维度的严格单调序列:
      • 对 w 排序,然后再来找 h 维度严格单调递增序列长度;
      • 在 w 排序时,会遇到 w(i) == w(j) 的情况,这时需要使用 h 比较,让 h(i) > h(j) 则能防止这种情况,即 sort 的比较函数定义如下:
        • [](const auto& e1, const auto& e2) {

        •     return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);

        • }

    • 综上:
      • 首先我们将所有的信封按照 w 值第一关键字升序、h 值第二关键字降序进行排序;

      • 随后我们就可以忽略 w 维度,求出 h 维度的最长严格递增子序列,其长度即为答案;

    • 定义 dp[i] 为第 i 个元素可以组成的最长严格递增子序列的长度,则其状态转移方程为:

      • 第 i 个元素之前的某个元素(假设下标为 j),满足:

        • ​​​​​​​h(j) < h(i),且;

        • dp[j] 是所有严格递增序列长度里最大的;

      • ​​​​​​​则:dp[i] = dp[j] + 1

    • 结果为所有 dp[i] 里取值最大的;

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        int n = envelopes.size();
        if (n == 0) {
            return 0;
        }

        std::sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) {
            return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);
        });

        std::vector<int> dp(n, 1);
        for (int i = 1; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (envelopes[j][1] < envelopes[i][1]) {
                    dp[i] = std::max(dp[i], dp[j] + 1);
                }
            }
        }

        return *std::max_element(dp.begin(), dp.end());
    }
};
  • 提交之后,发现运行时间超过了限制,需要对最长序列动态规划进行优化;

基于二分查找的动态规划

  • 思路:
    • TODO

————————————————

相关推荐

  1. 354. 俄罗斯信封问题

    2024-01-29 21:04:02       26 阅读
  2. 【重点!!!】【DP】354. 俄罗斯信封问题

    2024-01-29 21:04:02       66 阅读
  3. 动态规划算法 - LC354. 俄罗斯信封问题

    2024-01-29 21:04:02       39 阅读
  4. 704/35/34:二分查找

    2024-01-29 21:04:02       37 阅读
  5. 题解:704/35/34

    2024-01-29 21:04:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-29 21:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-29 21:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-29 21:04:02       82 阅读
  4. Python语言-面向对象

    2024-01-29 21:04:02       91 阅读

热门阅读

  1. 用二分法在有序数列中查找元素位置

    2024-01-29 21:04:02       41 阅读
  2. MySQL表的增删改查(进阶)

    2024-01-29 21:04:02       38 阅读
  3. Anaconda 镜像清华大学开源软件镜像站

    2024-01-29 21:04:02       61 阅读
  4. 【服务器】服务器的管理口和网口

    2024-01-29 21:04:02       61 阅读
  5. 遥感影像批量裁剪(语义分割样本制作)

    2024-01-29 21:04:02       59 阅读
  6. 1930:【05NOIP普及组】陶陶摘苹果

    2024-01-29 21:04:02       53 阅读
  7. 边缘计算在电力行业的应用:挑战与机遇

    2024-01-29 21:04:02       61 阅读