问题描述
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。
现在,我们定义一种跟随关系,当且仅当 b < c 时,数对 (c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
示例 :
输入: [[1,2], [2,3], [3,4]]
输出: 2
解释: 最长的数对链是 [1,2] -> [3,4]
注意:
给出数对的个数在 [1, 1000] 范围内。
类似算法题:【动态规划】俄罗斯套娃信封问题
import java.util.Collections;
import java.util.Comparator;
import java.lang.Math;
import java.util.List;
import java.util.ArrayList;
public class Solution{
public int solution(int[][] data){
if(null == data || data.length == 0){
return 0;
}
List<List<Integer>> tmp = new ArrayList<List<Integer>>();
for(int i = 0; i < data.length; i++){
List<Integer> d = new ArrayList<Integer>();
d.add(data[i][0]);
d.add(data[i][1]);
tmp.add(d);
}
Collections.sort(tmp, new Comparator<List<Integer>>(){
public int compare(List<Integer> o1, List<Integer> o2){
return o1.get(0) < o2.get(0) ? 1 : 0;
}
});
int[] dp = new int[data.length];
int max = 0;
for(int i = 0; i < tmp.size(); i++){
for(int j = i + 1; j < tmp.size(); j++){
if(tmp.get(i).get(1) < tmp.get(j).get(0)){
dp[j] = Math.max(dp[i] + 1, dp[j]);
max = Math.max(max, dp[j]);
}
}
}
return max + 1;
}
}