6Luffy6

导航

3637 最长上升子序列

传送锚点:https://www.luogu.com.cn/problem/B3637

题目描述

这是一个简单的动规板子题。

给出一个由 \(n(n\le 5000)\) 个不超过 \(10^6\) 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。

最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。

输入格式

第一行,一个整数 \(n\),表示序列长度。

第二行有 \(n\) 个整数,表示这个序列。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

6
1 2 4 1 3 4

样例输出 #1

4

提示

分别取出 \(1\)\(2\)\(3\)\(4\) 即可。

思路

a[i]为原数组,f[i]记录以a[i]为结尾的最长上升子序列长度,初始时将f数组全部初始化为1,引用双指针去遍历,

code

#include <iostream>
#include <cstring>
using namespace std;
const int N = 5005;
int a[N], f[N];//f[i]记录以a[i]为结尾的最长上升子序列长度
int ans = 1;
void solve(int n){
    //初始化 f
    for(int i = 0; i < n; i++)
       f[i] = 1;

    for(int i = 1; i < n; i++){
        for(int j = 0; j < i; j++){
            if(a[j] < a[i]){
                f[i] = max(f[i], f[j] + 1);
     // f[j] + 1为以a[j]为结尾的最长上升子序列长度 + a[i]
            }
        }
        ans = max(ans, f[i]);
    }
}
int main() {
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    solve(n);
    cout << ans << endl;
    return 0;
}

posted on 2024-06-11 23:45  极客三刀流  阅读(35)  评论(0)    收藏  举报