最长不连续上升序列----动态规划

本文介绍了一个算法问题——求解给定整数数组中最长上升子序列的长度,并提供了一段Java代码实现。通过动态规划的方法,该算法能够有效地找出序列中元素递增的最长子序列。

返回数字序列的最长上升子序列的长度,数字不要求连续
给定一个整数n和长度为n的数组,请返回最长上升子序列的长度。
测试样例:
7
2 1 4 3 1 5 6
返回:4

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int a[]=new int[n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
        sc.close();
        int[] dp = new int[n];
        for(int i = 0; i < n; i++) {
            dp[i] = 1;
            for(int j = 0; j < i; j++) {
                if(a[j] < a[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
        System.out.println(dp[n - 1]);
    }
}
### 最长连续递增子序列算法实现 最长连续递增子序列(Longest Continuous Increasing Subsequence, LCIS)问题的目标是从一个数组中找出一段最长连续子序列,其中所有的元素都严格递增。这个问题可以通过动态规划或者简单的线性扫描方法解决。 以下是基于 Python 的一种高效实现方式: #### 方法描述 通过一次遍历数组完成计算,维护两个变量 `current_length` 和 `max_length` 来分别记录当前连续递增子序列的长度以及全局最大长度。当遇到满足递增条件的情况时,重置 `current_length` 并继续比较。 ```python def findLengthOfLCIS(nums): if not nums: return 0 max_length = 1 # 记录全局最大长度 current_length = 1 # 当前连续递增子序列长度 for i in range(1, len(nums)): if nums[i] > nums[i - 1]: current_length += 1 # 如果当前数大于前一个数,则增加长度 max_length = max(max_length, current_length) # 更新最大长度 else: current_length = 1 # 否则重新计数 return max_length ``` 此代码的时间复杂度为 O(n),空间复杂度为 O(1)[^6]。 --- #### 贪心与二分优化思路 对于某些变种问题,可能需要进一步降低时间复杂度或处理更大的输入规模。此时可以引入贪心策略配合二分查找技术。具体而言,利用辅助数组存储潜在候选解,并借助二分查找快速定位插入位置以保持单调性[^5]。 例如下面这段 JavaScript 实现展示了如何结合这些技巧解决问题: ```javascript function lengthOfLIS(nums) { const tails = []; for (const num of nums) { let low = 0; let high = tails.length; while (low < high) { // 使用二分查找确定num应放置的位置 const mid = Math.floor((low + high) / 2); if (tails[mid] < num) { low = mid + 1; } else { high = mid; } } if (low === tails.length) { tails.push(num); // 若找到合适位置,则追加至末尾 } else { tails[low] = num; // 替换原有较小值以便后续增长 } } return tails.length; // 辅助数组大小即为目标结果 } ``` 这种方法同样适用于寻找最长递增子序列场景下,其核心思想在于维持一个有序列表用于逼近最终答案的同时减少必要的重复运算开销[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值