欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法实践:最长上升子列

程序员文章站 2022-03-24 15:25:24
...

最长上升子列

描述

一个数的序列ai,当a1<a2<…<aS的时候,我们称这个序列是上升的。

对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…, aiK),这里1<=i1<i2<…<iK<=N。

比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3, 5,8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

输入

输入的第一行是序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

输出

最长上升子序列的长度。

样例

7
72 24 76 89 82 48 86 
4

难度

中,动态规划填表

解法

算法实践:最长上升子列

代码

#include "bits/stdc++.h"
#include "vector"
#include "algorithm"
using namespace std;
int lengthOfLIS(int *nums,int n) {
    if (n == 0) return 0;
    int dp[n];
    for (int i = 0; i < n; ++i) {
        dp[i] = 1;
        for (int j = 0; j < i; ++j) {
            if (nums[j] < nums[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }
    int max = dp[0];
    for(int i=1;i<n;i++){
        if(dp[i]>max) max = dp[i];
    }
    return max;
//    return *max_element(dp.begin(), dp.end());
}
int main()
{
    int n;
    cin>>n;
    int nums[n];
    for(int i = 0;i<n;i++)
        cin >> nums[i];
    cout<<lengthOfLIS(nums,n);
}
相关标签: 算法设计