动态规划——单调递增最长子序列

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

输入格式:

输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开

输出格式:

最长单调递增子序列的长度

输入样例:

在这里给出一组输入。例如:

5
1 3 5 2 9

输出样例:

在这里给出相应的输出。例如:

4

想到的思路是从前往后填表的方式,m表记录当前位置的最长子序列。

AC代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //输入n
        String str1 = sc.nextLine();
        int n = Integer.parseInt(str1);
        String str = sc.nextLine();

        //输入n个数
        String[] s = str.split(" ");
        int[] num = new int[n];
        for (int i = 1; i < n; i++) {
            num[i] = Integer.parseInt(s[i]);
        }

        //m[i]表示从num[0]到num[i]的最长子序列
        int[] m = new int[n];
        //max实时记录最长子序列
        int max = 0;
        //先将m[0]即num[0]单独表示为最长子序列1,便于后面的比较
        m[0] = 1;

        //从num[1]开始,num[0]到num[i]的最长子序列
        for (int i = 1; i < n; i++) {
            //记录当前序列长度
            int l = 0;

            //找num[0]到num[i]的最长子序列
            for (int j = 0; j < i; j++) {
                if (m[j] > l && num[j] < num[i]) {
                    l = m[j];
                }
            }
            m[i] = l + 1;
            max = Math.max(max, m[i]);
        }
        System.out.println(max);
    }
}

版权声明:本文为weixin_45461609原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。