最长递增子序列

最长递增子序列(Longest Increasing Subsequence,简写 LIS)是动态规划
比较经典的一个问题。

先定义一个dp 数组:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度。
最终结果(子序列的最大长度)就是 dp 数组中的最大值。

根据刚才对 dp 数组的定义,dp[i] 的值,也就是以 nums[i] 为结尾的最长递增子序列。

如何通过 dp[0...i-] 的结果推出dp[i]
既然是递增子序列,我们只要找到前面那些结尾比 nums[i]小的子序列,然后把 nums[i] 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。这里可能出现多个取最大那个。

base case。dp 数组应该全部初始化为 1

public static int[] lis(int[] nums){
    int length = nums.length;
    int[] dp = new int[length];
    for (int i=0;i

你可能感兴趣的:(最长递增子序列)