问题链接:https://leetcode.com/problems/russian-doll-envelopes/
俄罗斯套娃问题,因垂丝汀!!!,要求俄罗斯套娃能够达到的最多嵌套的层数。先要理解对于两个封套(数组a和数组b)怎样才能嵌套在一起:当a[0]<b[0] && a[1]<b[1]。那是不是要对原二维数组进行排序呢?答案是肯定的!
排完序后呢?这个问题是不是类似于数组中最长增长子序列长度?哈哈哈,就是!很容易get到这个点!!!那就动态规划一下,代码如下:
class Solution {
public static int maxEnvelopes(int[][] envelopes) {
if(envelopes==null || envelopes.length==0 || envelopes[0]==null || envelopes[0].length==0)
return 0;
Arrays.sort(envelopes,new Comparator<int[]>()
{
public int compare(int[] o1,int[] o2)
{
int n=o1[0]-o2[0];
return n==0?o1[1]-o2[1]:n;
}
});
int[] dp=new int[envelopes.length];
dp[0]=1;
int ret=1;
for(int i=1;i<envelopes.length;i++)
{
int maxVal=0;
int j=i-1;
for(;j>=0;j--)
{
if(lessSize(envelopes[j],envelopes[i]))
maxVal=Math.max(maxVal,dp[j]);
}
dp[i]=maxVal+1;
ret=Math.max(ret,dp[i]);
}
return ret;
}
public static boolean lessSize(int[] a,int[] b)
{
return (a[0]<b[0]) & (a[1]<b[1]);
}
}