题解:AcWing 895 最长上升子序列

【题目来源】

AcWing:895. 最长上升子序列 - AcWing题库

【题目描述】

给定一个长度为 \(N\) 的数列,求数值严格单调递增的子序列的长度最长是多少。

【输入】

第一行包含整数 \(N\)

第二行包含 \(N\) 个整数,表示完整序列。

【输出】

输出一个整数,表示最大长度。

【输入样例】

7
3 1 2 1 8 5 6

【输出样例】

4

【算法标签】

《AcWing 895 最长上升子序列》 #动态规划# #线性DP# #最长上升子序列#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 1005; // 定义常量N,表示数组的最大长度
int n; // 输入的数组长度
int a[N]; // 存储输入的数组
int f[N]; // f[i]表示以a[i]结尾的最长上升子序列的长度

int main()
{
    cin >> n; // 输入数组的长度
    for (int i = 1; i <= n; i++) cin >> a[i]; // 输入数组元素

    // 动态规划求解最长上升子序列
    for (int i = 1; i <= n; i++)
    {
        f[i] = 1; // 初始化f[i],至少包含a[i]一个数,所以长度为1

        // 遍历a[i]之前的所有元素,寻找可以接在a[i]前面的最长上升子序列
        for (int j = 1; j < i; j++)
            if (a[j] < a[i]) // 如果a[j] < a[i],说明a[j]可以接在a[i]前面
                f[i] = max(f[i], f[j] + 1); // 更新f[i],取f[j]+1和当前f[i]的最大值
    }

    int res = 0; // 用于存储最终的最长上升子序列的长度
    for (int i = 1; i <= n; i++)
        res = max(res, f[i]); // 遍历f数组,找到最大值

    cout << res << endl; // 输出结果
    return 0;
}

【运行结果】

7
3 1 2 1 8 5 6
4
posted @ 2026-02-21 15:43  团爸讲算法  阅读(2)  评论(0)    收藏  举报