最长上升子序列

题目

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
第一行包含整数 N
第二行包含 N 个整数,表示完整序列。

原题链接

介绍

  • f[i]代表的就是以i为结尾的最长上升子序列的长度,每遍历到一个数i的时候就要遍历j(从1到i-1的数),如果a[i] > a[j]说明可以组成上升子序列,然后dp[i]=max(dp[i], dp[j] + 1)
  • 注意一开始要将dp[i]初始为1,只有自己本身的长度。

源代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;

int dp[N], a[N];

int main()
{
    int n;
    cin >> n;

    for (int i = 1; i <= n; i ++ ) cin >> a[i];

    for (int i = 1; i <= n; i ++ )
    {
        dp[i] = 1;
        for (int j = 1; j < i; j ++ )
        {
            if (a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1);
        }
    }

    int res = 0;
    for (int i = 1; i <= n; i ++ ) res = max(res, dp[i]);

    cout << res << endl;

    return 0;
}
THE END