动态规划
- 思路:
- 同时控制 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] 里取值最大的;
- 同时控制 w、h 两个维度比较复杂,可以先固定一个维度,来找出另外一个维度的严格单调序列:
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
————————————————