最长上升子序列(dp)

Description
一个数的序列bi,当b1< b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN),
我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1<=i1  
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
Input
输入的第一行是序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
Output
最长上升子序列的长度。
Sample Input
6
1 6 2 5 4 7
Sample Output
4

思路:

序列元素存储在q数组中

dp[i] 表示以q[i]结尾的子序列长度的最大值

初始化:dp[i]=1

转移方程:dp[i]=max(dp[i],dp[j]+1) 如果q[j]>q[i]

public class 最长上升子序列 {
    static final int N=1000+10;
    static int q[]=new int[N];
    static int dp[]=new int[N]; //dp[i] 表示以q[i]结尾的最长上升子序列
    static int n;
      public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for(int i=1;i<=n;i++) q[i]=sc.nextInt();
        //初始化
        for(int i=1;i<=n;i++) dp[i]=1;
        for(int i=2;i<=n;i++){
            for(int j=1;j<i;j++){
                if(q[j]<q[i]) dp[i]=Math.max(dp[i], dp[j]+1); //状态转移方程
            }
        }
        //现在dp[i]存储的都是以q[i]结尾的上升子序列的最大长度
        //求出dp数组的最大值
        int max=Integer.MIN_VALUE;
        for(int i=1;i<=n;i++){
            if(dp[i]>max) max=dp[i];
        }
        System.out.println(max);
    }
}

 

posted @ 2021-03-23 09:53  nb小歪  阅读(104)  评论(0)    收藏  举报