思路是对其中一个维度比如宽度w从小到大排序,然后等效于对另一个维度找最大上升子序列
有一种特殊情况需要注意,就是当宽度相同时,如果高度也按照从小到大,就会出现重复计算。如果将高度从大到下排列,就不会有这个问题,这样也就解决了这道题目
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
int n = envelopes.size();
if(n==0) return 0;
sort(envelopes.begin(),envelopes.end(),[](const vector<int>& a,const vector<int>& b){
return a[0]<b[0]||(a[0]==b[0]&&a[1]>b[1]);
});
int res = 0;
vector<int> dp(n,1);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(envelopes[i][1]>envelopes[j][1]) dp[i] = max(dp[i],dp[j]+1);
}
res = max(res,dp[i]);
}
return res;
}
};