题目描述:
标签:贪心 数组 动态规划 排序
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。
现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
代码:
思路分析:
1、确定dp数组以及下标的含义——这里dp[i]表示到下标i之前的数对中最长数对链的长度
2、确定递推公式,用当前下标i的第一个值与(0,i-1)区间的下标的第二个值比较,如果大于则对应的长度+1,所以dp[i] = max(dp[i],dp[j]+1)
3、dp数组初始化,dp[i] = 1,所有的数组值都是1
4、确定遍历顺序,for循环遍历,i从1到n,j从0到i
5、举例推导dp数组
6、最后返回所有dp[i]的和
class Solution {
public int findLongestChain(int[][] pairs) {
int n = pairs.length;
Arrays.sort(pairs, new Comparator<int[]>(){
public int compare(int[] p1, int[] p2){
return p1[0] - p2[0];
}
});
int[] dp = new int[n];
Arrays.fill(dp,1);
for(int i = 1;i < n;i++){
for(int j = 0;j < i;j++){
if(pairs[i][0] > pairs[j][1]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
}
return Arrays.stream(dp).max().orElse(0);
}
}