题目

 题目链接:
 https://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f
相同的题目:
 https://www.lintcode.com/problem/602
思路
	本质是求最长子序列问题
	envelopes 先按 w 升序排序,再按 h 降序 排序,
	只需考虑h即可,因为w已经升序排列好,因为h大的在前,所以相同的w下的不同h,只会选择最大的那个h。
	就可以将问题转换为 h 的 Longest Increasing subSequence
	对参数长度升序,宽度降序排序
	因为长度和宽度都要大于才能装进去
	比如:int[][] arr = {{5,4},{6,4},{6,7},{2,3}};//2,3  5,4  6,7  6,4
	求的就是 3 4 7 4  最长递增子序列问题
参考答案Java
import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param letters int整型二维数组
     * @return int整型
     */
    public int maxLetters (int[][] letters) {
          Arrays.sort(letters, new Comparator<int[]>() { //长升序,长相同,宽降序
                @Override
                public int compare(int[] a, int[] b) {
                    if(a[0] !=b[0]){
                        return a[0]-b[0];
                    }else{
                        return b[1]-a[1];
                    }
                }
            });
            int[] dp = new int[letters.length];
            Arrays.fill(dp,1);
            //宽度 最长上升子序列问题
            int ans = 1;
            for (int i = 0; i <letters.length ; i++) {
                for (int j = i-1; j >=0 ; j--) {
                    if(letters[j][1]<letters[i][1]){
                        dp[i] = Math.max(dp[i],dp[j]+1);
                    }
                    ans =Math.max(dp[i],ans);
                }
            }
            return ans;
    }
}
参考答案Go
package main
import "sort"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param letters int整型二维数组
 * @return int整型
 */
func maxLetters(letters [][]int) int {
	//本质是最递增子序列问题
	//长度升序,相同长度,宽度降序
	sort.Slice(letters, func(i int, j int) bool {
		if letters[i][0] != letters[j][0] {
			return letters[i][0] < letters[j][0]
		} else {
			return letters[i][1] > letters[j][1]
		}
	})
	//高度的最长上升子序列问题
	dp := make([]int, len(letters))
	ans := 1
	for i := 0; i < len(letters); i++ {
		dp[i] = 1
		for j := i - 1; j >= 0; j-- {
			if letters[j][1] < letters[i][1] {
				cur := dp[j] + 1
				if cur > dp[i] {
					dp[i] = cur
				}
				if ans < dp[i] {
					ans = dp[i]
				}
			}
		}
	}
	return ans
}
参考答案PHP
<?php
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param letters int整型二维数组 
 * @return int整型
 */
function maxLetters( $letters )
{
     usort($letters,function ($a,$b){
       if($a[0] !=$b[0]){ //长度升序
           return $a[0]-$b[0];
       } else{
           //长度一样,宽度降序
           return $b[1]-$a[1];
       }
    });
    //长度的最长上升子序列问题
    $dp = array();
    $ans =1;
    for($i=0;$i<count($letters);$i++){
        $dp[$i] =1;
        for($j=$i-1;$j>=0;$j--){
            if($letters[$j][1] < $letters[$i][1]){
                $cur =$dp[$j]+1;
                if($dp[$i] < $cur){
                    $dp[$i] =$cur;
                    if($cur>$ans){
                        $ans =$cur;
                    }
                }
            }
        }
    }
    return $ans;
}


















