叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点。现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人高。请编写一个算法,计算最多能叠多少人,注意这里所有演员都同时出现。
给定一个二维int的数组actors,每个元素有两个值,分别代表一个演员的身高和体重。同时给定演员总数n,请返回最多能叠的人数。保证总人数小于等于500。

测试样例:

[
[1,2],
[3,4],
[5,6],
[7,8]
],4

返回:4

解题

高的人,重的人在下面

矮的人,轻的人在上面

按照升高升序排序后,找到体重的最长上升子序列就好了

import java.util.*;

public class Stack {
    public int getHeight(int[][] A, int n) {
        // write code here
		 Arrays.sort(A, new myComparator());
        int[] dp = new int[n];
        int height = -1;
        dp[0] = 1;
        for(int i=1;i<n;i++){
            int h = 0 ;
            for(int j=0;j<i;j++){
                if(A[i][1] > A[j][1]){
                    h = Math.max(h,dp[j]);
                }
            }
            dp[i] = h + 1;
            height = Math.max(dp[i],height);
        }
        return height;
    }
    class myComparator implements Comparator<int[]>{
        public int compare(int[] a, int[] b) {
                if(a[0] < b[0])
                    return -1;
                else if(a[0] > b[0])
                    return 1;
                else {
                    if(a[1] < b[1])
                        return -1;
                    else if(a[1] > b[1])
                        return 1;
                    else
                        return 0;
                }
            }
    }
}

注意理解上面如何实现的排序