和LeetCode300的思路一样
,先对数组进行排序,按照数组中第一个元素进行排序。dp[i]
表示以pairs[i]
这个数对作为结尾的最长链的长度,最小为1, 状态转移方程dp[i]=Max(if(pairs[i][0]>pairs[j][1]:dp[j]+1
;先保证`pairs[j]结尾的链加上pairs[i]还是符合题意
package BDyNamicProgramming;
import DString.Problem3;
import sun.dc.pr.PRError;
import java.util.Arrays;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/22 0022 17:23
*/
public class Problem646 {
/**
* dp[i] 前i个一维数组能组成最长对数链长度
* dp[i]是在前 dp[j] ( j在[0,i)之间) 中选择一个最长对数链家上这一个组成
* dp[0]=1
* dp[1]=
* @param pairs
* @return
* 先排序,再用300最长上升子序列一样的思路,
* 用DP的做法排序的时候应该是依照pairs[i]的0处元素大小排,然后对排好序的数组,按照特定规则填DP表
* 设dp[i]表示以pairs[i]这个数对作为结尾的最长链的长度,最小为1
* dp[i]=max (if(pairs[i][0]>pairs[j][1]):dp[j]+1
* 先保证pairs[j]结尾的链加上paris[i]还是符合提议的数对联再加1
* 注意不必统计每一个数对结尾的可能的链长的最大值了
*/
public int findLongestChain(int[][] pairs) {
if(pairs.length==0) return 0;
if(pairs.length==1) return 1;
int[] dp = new int[pairs.length];
//先按照数组里的第一个元素进行排序
Arrays.sort(pairs, (a, b) -> a[0] - b[0]);
dp[0]=1;
//当且 晋档 (a,b) (c,d) b<c 或者
if(pairs[0][1]<pairs[1][0]||pairs[1][1]<pairs[0][0]){
dp[1]=2;
}else{
dp[1]=1;
}
//递推dp[i]
/*
已知 dp[0] dp[1] dp[2] .....dp[i-1]
dp[i]
*/
for(int i=2;i<pairs.length;i++){
dp[i]=1;
for(int j=0;j<i;j++){
if(pairs[j][1]<pairs[i][0]){
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
}
int max = 0;
for(int i=0;i<dp.length;i++){
if(max<dp[i]) max=dp[i];
}
return max;
}
public static void main(String[] args) {
int[][] arr = {{9,10},{-4,9},{-5,6},{-5,9},{8,9}};
// Problem646 problem646 = new Problem646();
// problem646.findLongestChain(arr);
Arrays.sort(arr);
}
}