- LIS问题是处理一维数据,这里是两维
- 容易想到修改的方法。首先,按宽w递增排序,如果碰到w相等,则按高h递减排序。
- 这样,在给第二列h中找LIS时,就会忽略掉w相等带来的影响。即,相同w不同的两个或多个h,不会构成一个新的递增子序列
- 另外,注意多维排序的写法
- 首先排第一维,如果第一维相等就排第二维,cmp函数的写法很值得看一看
class Solution {
public:
static bool cmp(const vector<int>& v1, const vector<int>& v2){
return v1[0]==v2[0]?v2[1]<v1[1]:v1[0]<v2[0];
}
int maxEnvelopes(vector<vector<int>>& envelopes) {
if(envelopes.empty()) return 0;
sort(envelopes.begin(), envelopes.end(), cmp);
int len = envelopes.size();
vector<int> dp(len, 1);
dp[0]=1;
int res = dp[0];
for(int i=1; i<len; i++){
for(int j=0; j<i; j++){
if(envelopes[j][1]<envelopes[i][1])
dp[i] = max(dp[i], dp[j]+1);
}
res = max(res, dp[i]);
}
return res;
}
};