最长上升子序列(经典动态规划问题)

简介: 最长上升子序列(经典动态规划问题)

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


输入格式

第一行包含整数 N。


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


输出格式

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


数据范围

1≤N≤1000,

−10^9≤数列中的数≤10^9


输入样例:
1. 7
2. 3 1 2 1 8 5 6
输出样例:
4

思路:弄清楚状态划分就行,dp[i]表示i下表下的最长升序长度,以此状态转移方程就是dp[i]=max(dp[j]+1) j=1,2,3,4.....n-1.

带注释代码:

#include <iostream>
using namespace std;
#include <algorithm>
 
const int N = 1010;
int a[N];  // 存储输入的序列
int dp[N];  // dp数组用于记录以第i个元素结尾的最长递增子序列的长度
 
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;  // 初始值,每个元素自成一个长度为1的递增子序列
        for (int j = 1; j <= i; ++j) {
            if (a[i] > a[j])
                dp[i] = max(dp[i], dp[j] + 1);  // 更新dp[i]为当前最大长度
        }
    }
 
    int res = 0;  // 用于存储最终结果,即最长递增子序列的长度
 
    // 找到dp数组中的最大值,即为最长递增子序列的长度
    for (int i = 1; i <= n; i++)
        res = max(res, dp[i]);
 
    // 输出结果
    cout << res << endl;
 
    return 0;
}
相关文章
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
|
1月前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
120 0
动态规划算法学习二:最长公共子序列
|
6月前
|
人工智能
最长公共子序列(经典动态规划问题)
最长公共子序列(经典动态规划问题)
|
6月前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
50 1
|
算法 C语言 C++
【动态规划】最长上升子序列(单调队列、贪心优化)
本篇是对最长上升子序列基础做法的一种优化
68 0
初学算法之动态规划---最长上升子序列
初学算法之动态规划---最长上升子序列
|
算法 Java C++
数据结构与算法之最长公共子序列&&动态规划
数据结构与算法之最长公共子序列&&动态规划
110 0
数据结构与算法之最长公共子序列&&动态规划
|
算法 关系型数据库 MySQL
浅谈最长公共子序列引发的经典动态规划问题
这篇文章通过一道经典例题:最长公共子序列,给大家讲讲动态规划,并且给出一道LeetCode周赛动态规划题作为练手并讲解,相信看完文章之后,你会对动态规划有更深的理解。
117 0
浅谈最长公共子序列引发的经典动态规划问题
|
算法 Java
《趣学算法-动态规划-最长的公共子序列》阅读笔记
《趣学算法-动态规划-最长的公共子序列》阅读笔记
105 0
《趣学算法-动态规划-最长的公共子序列》阅读笔记