LeetCode646 最长对数链

最长对数链>>>
在这里插入图片描述

和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);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值