题目
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
思路:动态规划
当前信封的宽度和高度均大于前面的信封,即可将前面的信封包住,则信封数加1。因此,我们首先按照宽度进行从小到大排序,之后再看高度,只要满足的信封的高度严格递增即可。但是第一位相等的时候,无法直接看高度。因此,我们先按照宽度进行排序后,再此基础上按照高度进行逆序排序,则可以避免当前情况。arr[i] 表示 前 i 个元素可以组成的最长严格递增子序列的长度。
if(dp[i][1] > dp[j][1])
arr[i]=Math.max(arr[i],arr[j]+1); j [0,i-1]
代码
1.怎么从键盘中读取?
建立两个输入,第二个读取第一个读取出来的一行,然后再对其作处理
Scanner in = new Scanner(System.in);
String line = in.nextLine();
Scanner in2 = new Scanner(line); ArrayList<Integer> row = new ArrayList();
while(in2.hasNextInt()){
row.add(in2.nextInt());}
2.Comparator的使用:前-后升序,后-前降序
Arrays.sort(dp,new Comparator<>(){
@Override
public int compare(int[] o1, int[] o2) {
return }
});
3.怎么比较二维数组
在比较器中传入数组
Arrays.sort(dp,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {//后面-前面降序排列
return o1[0]==o2[0]?o2[1]-o1[1]:o1[0]-o2[0];}
});
import java.util.*;
public class Main{
public static void main(String[] args){
//System.out.println("Enter a space separated list of numbers:");
Scanner in = new Scanner(System.in);
String line = in.nextLine();
Scanner in2 = new Scanner(line);
ArrayList<Integer> row = new ArrayList();
while(in2.hasNextInt()){
row.add(in2.nextInt());}
//取值
int[][] dp=new int[(row.size()-1)/2+1][2];
for(int i=0;i<=(row.size()-1)/2;i++){
dp[i][0]=row.get(2*i);
dp[i][1]=row.get(2*i+1); }
//按照数组第一位从小到大排序,若相等则按照第二位降序排列(后-前)
Arrays.sort(dp,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {//后面-前面降序排列
return o1[0]==o2[0]?o2[1]-o1[1]:o1[0]-o2[0];}
});
/*for(int j=0;j<len;j++){
for(int k=0;k<=len-1-j;k++){//
if(dp[k+1][0]<dp[k][0]){//把大的放后面了
int temp=dp[k][0]; int temp1=dp[k][1];
dp[k][0]=dp[k+1][0]; dp[k][1]=dp[k+1][1];
dp[k+1][0]=temp; dp[k+1][1]=temp1; }
}
}*/
int result=0;//结果
int len=dp.length;//末尾下标 1
int[] arr=new int[len];//代表以i索引为结束位置信封的最大个数
//dp[i]=max(dp[i],dp[j]+1) j [0,i-1]
arr[0]=1;
for(int i=1;i<=len-1;i++){//
for(int j=0;j<=i-1;j++){
if(dp[i][1] > dp[j][1]) arr[i]=Math.max(arr[i],arr[j]+1);
}}
System.out.println(arr[len-1]);
}
}