简单编程题目连载(九)——最长上升子序列

本文介绍了一种使用动态规划解决最长递增子序列(LIS)问题的方法。通过定义dp数组记录以每个元素结尾的最长递增子序列长度,最终求得整个序列的最长递增子序列长度。

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

这是一道经典动态规划题目,LIS最长上升子序列问题。

问题描述:给定数组arr,返回arr的最长递增子序列长度。比如arr = [2,1,5,3,6,4,8,9,7],最长递增子序列为:[1,3,4,8,9],所以返回这个子序列的长度5。

本题的暴力搜索方法思路是以arr[0~i]为头,遍历整个数组,只要有比当前数大的,length+1,数组向后移一位。每次遍历结束,如果变量max小于当前length,令max等于length。

显然这样的遍历方法重复太多,效率太低。

动态规划的整体思路是利用空间换时间。那么针对本题思路如下:

定义数组dp[n],n为arr数组长度。dp[i]表示把arr[i]当做最后一个数时,其最长增长子序列的长度。而dp[0]为第一个数的最长子序列长度,自然其结果为1。用下表举例说明上述例子。

数组123456789
arr215364897
dp112233454

也就是说,本题的目的转换成了,去找小于arr[i]的arr[0~i-1]其中对应dp值最大那个数加1即可。

代码:

public int getLIS(int[] arr,int n){
    if(arr == null || n <= 0){
        return 0;
    }
    int[] dp = new int[n];
    int length = 0;
    int max = 0;
    dp[0] = 1;
    for(int i = 1; i < n; i++){
        length = 0;
        for(int j = 0; j < i; j++){
            if(arr[j] < arr[i]){
                if(dp[j] > length){
                    length = dp[j];
                }
            }
        }
        dp[i] = length +1;
        if(dp[i] > max){
            max = dp[i];
        }
    }
    return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值