题目描述
小明有一袋子长方形的积木,如果一个积木A的长和宽都不大于另外一个积木B的长和宽,则积木A可以搭在积木B的上面。好奇的小明特别想知道这一袋子积木最多可以搭多少层,你能帮他想想办法吗?
定义每一个长方形的长L和宽W都为正整数,并且1 <= W <= L <= INT_MAX, 袋子里面长方形的个数为N, 并且 1 <= N <= 1000000.
假如袋子里共有5个积木分别为 (2, 2), (2, 4), (3, 3), (2, 5), (4, 5), 则不难判断这些积木最多可以搭成4层, 因为(2, 2) < (2, 4) < (2, 5) < (4, 5)。
解题思路
先对宽排序
那么问题就转化成:寻找此时所有长的最长不递减子序列
1. 寻找最大非递减子集
1. O( N 2 N^2 N2)
对于长度为N的数组A[N] = {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],
L[n] = 1;那么L[j] = max(L[i]) + 1, where i < j && a[i] < a[j],
也就是i的范围是i到n。这样,想求aj结尾的最大递增子序列的长度,
我们就需要遍历j之前的所有位置i(0到j-1),找出a[i] < a[j],计算这些i中,能产生最大L[i]的i,之后就可以求出L[j]。
之后我对每一个A[N]中的元素都计算以他们各自结尾的最大递增子序列的长度,
这些长度的最大值,就是我们要求的问题——数组A的最大递增子序列。