动态规划
- 思路: - 同时控制 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
 
————————————————
