思路:最长递增子序列问题的二维化
class Solution {
public int maxEnvelopes(int[][] envelopes) {
Arrays.sort(envelopes, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);
int n = envelopes.length;//有多少个信封
int[] dp = new int[n];//前i个元素对应的最长递增子序列
int max = 0;
for(int i = 0 ; i < n; i++){
int temp = 1;
for(int j = i - 1; j >= 0; j--){
if(envelopes[i][0] > envelopes[j][0]
&& envelopes[i][1] > envelopes[j][1]){
temp = Math.max(temp, dp[j] + 1);
}
}
dp[i] = temp;
max = Math.max(max, dp[i]);
}
return max;
}
}