先对长排序,再在长度一样的情况下对宽排序,再对宽求最长上升子序列dp。
class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b){
if(a[0]<b[0]){
return true;
}
else if(a[0]==b[0]){
return a[1]<b[1];
}
else{
return false;
}
}
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(),envelopes.end(),cmp);
int dp[5000]={0};
int maxnum=0;
for(int i=0;i<envelopes.size();i++){
for(int j=0;j<i;j++){
if(envelopes[i][0]>envelopes[j][0]&&envelopes[i][1]>envelopes[j][1]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
maxnum=max(maxnum,dp[i]);
}
return maxnum+1;
}
};
网友评论