leetcode300 最长上升子序列

题目描述

leetcode300 最长上升子序列_第1张图片

题目思路

使用动态规划算法的思想,首先状态的定义:dp[n]表示以s[n]结尾的最长递增子序列的长度。
那么dp[n]的由来就是s[n]之前存在的一条最长递增子序列的长度+1。所以转移方程就是:dp[n] = max(dp[i] + 1| s[i] < s[n] && i < n)。当然,也可能存在s[n]之前没有递增子序列,所以dp[n]=1的情况也是可能发生的。
所以,对于序列的每一个dp来说,初始值应该都是1。(dp[i] = 1 | 1 <=i <=n)
对于整个序列来说,最长递增子序列不一定是最后一个字符结尾的,所以我们需要从dp数组中找出最大值。max(dp[i] | 1 <= i <=n)

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int [] dp = new int[n + 1];
        for(int i = 0;i < n;i ++){
            dp[i] = 1;
            for(int j = 0;j < i;j ++){
                if(nums[i] > nums[j]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
        int max = 0;
        for(int i = 0;i < n;i ++){
            max = Math.max(max,dp[i]);
        }
        return max;
    }
}

leetcode300 最长上升子序列_第2张图片

你可能感兴趣的:(LeetCode,#,动态规划,算法,动态规划,leetcode,java,数据结构)