A-最长上升子序列

题解

       这一题应该就是动态规划的入门题了八。

       首先是状态表示,f[i] 表示以 i 结尾的最长上升子序列的长度。

       其次是状态计算,在 [0,i - 1] 中寻找 aj < ai 且 f[j] 的长度的最大值,取一个 max即可,即f[i] = max(f[i], f[j] + 1),初始长度为 1 即 f[i] = 1。

       两重循环,时间复杂度为 $O(n^2)$。

#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 110;
int n, maxlen;
int f[MAXN], a[MAXN];

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    // O(n)
    for (int i = 0; i < n; ++i) {
        f[i] = 1;
        for (int j = 0; j < i; ++j) {
            if (a[j] < a[i]) {
                f[i] = max(f[i], f[j] + 1);
            }
        }
    }
    int res = 0;
    for (int i = 0; i < n; ++i) res = max(res, f[i]);
    cout << res << endl;
    return 0;
}

 

posted @ 2020-11-01 16:17  Fool_one  阅读(57)  评论(0编辑  收藏  举报