最长递增子序列

本文介绍了一种求解最长递增子序列的算法实现,通过动态规划方法找到数组中最长递增子序列的长度及具体序列。文章提供了一个完整的Java实现示例,并通过单元测试验证了算法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
这里写图片描述
这里写图片描述

package com.lyf.dp;

import org.junit.Test;

/**
 * Created by fangjiejie on 2017/5/16.
 */
public class LongestIncreaSubsequences {
    public static int[] getdp(int arr[]){
        int dp[]=new int[arr.length];
        for(int i=0;i<arr.length;i++){//从左向右 找以当前元素为最大值而结尾时的序列中,最长递增子序列的长度
            dp[i]=1;
            for(int j=i-1;j>=0;j--){//找倒数第二个数,谁的递增子序列最大,选谁
                if(arr[i]>arr[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
        return dp;
    }
    public static int[] getSubsequence(int arr[]){
        int dp[]=getdp(arr);
        System.out.print("dp数组元素:");
        for(int i:dp){
            System.out.print(i+",");
        }
        System.out.println();
        int lenth=0;
        int index=0;
        //int mval
        for(int i=0;i<dp.length;i++){
          if(dp[i]>lenth){
              lenth=dp[i];//寻找最长递增子序列的长度
              index=i;//找递增序列最大长度所在的元素索引
          }
        }
        int []result=new int[lenth];//创建结果数组
        result[--lenth]=arr[index];
        for(int j=index-1;j>=0;j--){
            if(dp[j]==dp[index]-1&&arr[j]<arr[index]){//如果当前元素dp值=后一个元素dp-1,而且元素值比后一个元素值小,则被找到
               //System.out.println("index:"+index);
                result[--lenth]=arr[j];
                index=j;//记录新找到的元素的索引,在下次寻找中作比较,此行为并不影响j值的迭代,
            }
        }

        return result;
    }
    @Test
    public void test(){
        int arr[]={5,2,3,7,8,4,6,9};
        System.out.print("原数组:");
        for(int i:arr){
            System.out.print(i+",");
        }
        System.out.println();
        int res[]=getSubsequence(arr);
        System.out.print("最长递增子序列:");
        for(int i:res){
            System.out.print(i+",");
        }
    }
}

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值