Acwing.895 最长上升子序列(动态规划)

题目

给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数N。
第二行包含N个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤ 1000,
-109<数列中的数≤109

  • 输入样例:
7
3 1 2 1 8 5 6
  • 输出样例
4

题解

import java.util.Scanner;

/**
 * @author akuya
 * @create 2023-07-24-20:46
 */
public class MaximumAscending {
    static int N=1010;
    static int n;
    static int a[]=new int [N];
    static int f[]=new int[N];
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        for(int i=1;i<=n;i++){
            a[i]=scanner.nextInt();
        }

        

        for(int i=2;i<=n;i++){
            f[i]=1;
            for(int j=1;j<=i;j++){
                if(a[i]>a[j]){
                    f[i]=Math.max(f[j]+1,f[i]);
                }
            }
        }
        int res=-99;
        for(int i=1;i<=n;i++){
            res=Math.max(res,f[i]);
        }

        System.out.println(res);
    }
}

思路

这道题的思路如图所示
Acwing.895 最长上升子序列(动态规划)_第1张图片
很简单的一道动态规划,这道题的数据范围小,所以可以用O(n2)的方法实现,但是当数据量大了之后呢?下一道题将解决。

你可能感兴趣的:(java算法实录,算法,动态规划)