美文网首页java基础
动态规划(六)

动态规划(六)

作者: 茶还是咖啡 | 来源:发表于2020-10-11 17:57 被阅读0次

最长上升子序列

给定一个整数序列,求,其中最长上升子序列长度。(不要求子序列一定是连续的,只要相对位置不变即可)

  • [ 10, 9, 2, 5, 3, 7, 101, 18 ], 其中最长上升子序列长度为4
    最长上升子序列为[ 2, 5, 7, 101]

解法
LIS(i)表示以第i个数字结尾的最长上升子序列的长度。
LIS(i)表示0-i范围内,选择数字nums[i]可以获得的最长上升子序列长度。

LIS(i) = max( 1 + LIS(j) if(nums[i]>nums[j]) )
         j < i

对应的第 i 个数字的上升子序列为:之前第 nums[j](nums[j]<nums[i])的上升子序列的最大长度+1

如:

[ 10, 9, 2, 5, 3, 7, 101, 18]

num\i 0 1 2 3 4 5 6 7
10 1
9 1
2 1
5 2
3 2
7 3
101 4
8 4

其中i代表第i个元素的升序子序列最大长度。

  1. 第0个元素为10的最大升序序列为自己,即1
  2. 第1个元素为9,之前没有比9小的元素,所以最大升序长度为1
  3. 第2个元素为2,之前没有比2小的元素,所以最大升序长度即1
  4. 第3个元素为5,之前的元素2比5小,所以最大升序长度为2的最大升序长度+1,即1+1=2
  5. 第4个元素为3,之前的元素2比5小,所以最大升序长度为2的最大升序长度+1,即1+1=2
  6. 第5个元素为7,之前的元素2,5,3都比7小,选择最大的升序长度+1,即2+1=3
  7. 第6个元素为101,选取之前比他小的最大升序元素的值+1,即3+1=4
  8. 第7个元素为8,选取之前比他小的最大升序元素的值+1,即3+1=4

最后,得到的最大升序长度为4

编码实现

    int lis(int[] arr) {
        if (arr == null) {
            return -1;
        }
        if (arr.length <= 1) {
            return arr.length;
        }
        int len = arr.length;
        int[] memo = new int[len];
        Arrays.fill(memo, 1);
        for (int i = 1; i < len; i++) {
            for (int j = 0; j < i; j++) {
                if (arr[j] < arr[i]) {
                    memo[i] = Integer.max(memo[i], memo[j] + 1);
                }
            }
        }
        return max(memo);
    }

    private int max(int[] array) {
        if (array == null) {
            throw new IllegalArgumentException("The Array must not be null");
        } else if (array.length == 0) {
            throw new IllegalArgumentException("Array cannot be empty.");
        } else {
            int max = array[0];

            for (int j = 1; j < array.length; ++j) {
                if (array[j] > max) {
                    max = array[j];
                }
            }

            return max;
        }
    }

时间复杂度O(n^2)


Wiggle Subsequence

一个序列,他的相邻数字的大小关系是升序降序轮流交替,(最初可以是升序,也可以是降序),就称为wiggle sequence,比如:[1, 7, 4, 9, 2, 5]就是一个wiggle sequence,但是[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5]就不是,给出一个数组,求出他的最长wiggle sequence的序列。

相关文章

  • 动态规划(六)

    最长上升子序列 给定一个整数序列,求,其中最长上升子序列长度。(不要求子序列一定是连续的,只要相对位置不变即可)[...

  • 动态规划(六)

    这一次我们来看看动态规划中打家劫舍这一类的问题,在LeetCode中这类问题有:第198题:打家劫舍 https:...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 《数据结构与算法之美》27——初识动态规划

    前言 今天开始学习动态规划,一共有三节,分别是:初识动态规划、动态规划理论、动态规划实战。今天这一节就是初识动态规...

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

  • Dynamic Programming(动态规划)类算法分析随笔

    #动态规划 关于动态规划,先摘一段[wiki][1]的描述: ``` 动态规划(英语:Dynamic progra...

  • 什么是动态规划

    目录 动态规划解决了什么 什么是动态规划 典型的动态规划 1. 动态规划解决了什么 的思想就是将大问题拆分成小问题...

网友评论

    本文标题:动态规划(六)

    本文链接:https://www.haomeiwen.com/subject/gnkdpktx.html