3. DP_Lintcode76 最长增长(上升)子序列Longest Increasing Subsequence solution

一、题目

Given a sequence of integers, find the longest increasing subsequence (LIS).

You code should return the length of the LIS.

Example For [5, 4, 1, 2, 3], the LIS is [1, 2, 3], return 3

For [4, 2, 4, 5, 3, 7], the LIS is [4, 4, 5, 7], return 4

二、解题思路

方案一:动态规划 时间复杂度O(n*n)

dp[i] 表示以i结尾的子序列中LIS的长度。然后我用 dpj 来表示在i之前的LIS的长度。然后我们可以看到,只有当 a[i]>a[j] 的时候,我们需要进行判断,是否将a[i]加入到dp[j]当中。为了保证我们每次加入都是得到一个最优的LIS,有两点需要注意:第一,每一次,a[i]都应当加入最大的那个dp[j],保证局部性质最优,也就是我们需要找到 max(dpj) ;第二,每一次加入之后,我们都应当更新dp[j]的值,显然, dp[i]=dp[j]+1 。 如果写成递推公式,我们可以得到 dp[i]=max(dpj)+(a[i]>a[j]?1:0) 。

三、解题代码

public int longestIncreasingSubsequence(int[] nums) {  
    int[] f = new int[nums.length];  
    int max = 0;  
    for (int i = 0; i < nums.length; i++) {  
        f[i] = 1;  
        for (int j = 0; j < i; j++) {  
            if (nums[j] < nums[i]) {  
                f[i] = f[i] > f[j] + 1 ? f[i] : f[j] + 1;  
            }  
        }  
        if (f[i] > max) {  
            max = f[i];  
        }  
    }  
    return max;  
}  

下一篇: 4. DP_LeetCode121/122/123 &终极[k]次交易
上一篇: 2. DP_最长公共子序列

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,893评论 0 18
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,360评论 0 33
  • 转自:https://blog.csdn.net/George__Yu/article/details/75896...
    laochonger阅读 5,241评论 0 1
  • 我有一个朋友,在她高考前几天她爸因为疾病去世了。我不知道这种失去可以给人带来多大的毁灭。但是我知道,她没有因此一蹶...
    她说她喜欢黑色阅读 3,707评论 1 1
  • 今天儿子写完作业,我陪他一起练习了书法。昨天他学习的两个字是:求是,因为昨天是爸爸陪他去练习的书法,我不知...
    甜蜜蜜DY阅读 1,288评论 0 4

友情链接更多精彩内容