当前位置: 首页 > news >正文

【动态规划】最长上升子序列模板

最长上升子序列

题目传送门

一、题目描述

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

输入格式
第一行包含整数 N
第二行包含 N 个整数,表示完整序列。

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

数据范围
1 ≤ N ≤ 1000,
−10⁹ ≤ 数列中的数 ≤ 10⁹

输入样例

7
3 1 2 1 8 5 6

输出样例

4

二、题目分析

我们需要找到一个序列中最长的严格递增的子序列的长度。子序列不要求连续,但必须保持原序列中的相对顺序。

三、问题思考

算法分析
这是一个经典的动态规划问题。我们需要找到以每个元素结尾的最长上升子序列的长度,然后取所有可能中的最大值。

前置知识

  • 动态规划基本概念
  • 数组遍历和状态转移

四、动态规划思路

a. 状态表示

  • 定义 f[i] 表示以第 i 个元素结尾的最长上升子序列的长度。

b. 初始化

  • 每个元素本身就是一个长度为1的子序列,所以初始时 f[i] = 1

c. 状态转移

  • 对于每个 i,我们检查所有 j < i 的元素:
    • 如果 a[i] > a[j],说明 a[i] 可以接在 a[j] 后面,形成更长的子序列。
    • 因此,f[i] = max(f[i], f[j] + 1)

d. 最终结果

  • 最终结果是所有 f[i] 中的最大值。

五、代码实现

#include <bits/stdc++.h>

using namespace std;
const int N = 1010;

int n;
int a[N], f[N];
int res;

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

    for (int i = 1; i <= n; i++) {
        f[i] = 1; // 初始化为1,因为每个元素本身就是一个子序列
        for (int j = 1; j < i; j++)
            if (a[i] > a[j]) f[i] = max(f[i], f[j] + 1); // 状态转移
        res = max(res, f[i]); // 更新最大值
    }
    printf("%d", res);
    return 0;
}

六、重点细节

  1. 初始化:每个 f[i] 初始化为1,因为每个元素本身就是一个长度为1的子序列。
  2. 状态转移:内层循环遍历所有 j < i 的元素,如果 a[i] > a[j],则更新 f[i]
  3. 结果更新:每次计算完 f[i] 后,立即更新全局最大值 res

七、复杂度分析

  • 时间复杂度:O(N²),因为有两层嵌套循环,外层循环 N 次,内层循环最多 N 次。
  • 空间复杂度:O(N),用于存储数组 af

八、总结

本题是一个经典的动态规划问题,通过定义状态 f[i] 表示以第 i 个元素结尾的最长上升子序列的长度,然后通过状态转移逐步求解。最终结果是所有 f[i] 中的最大值。这种方法直观且易于理解,适合初学者掌握动态规划的基本思想。

http://www.dtcms.com/a/109529.html

相关文章:

  • 网络编程—网络概念
  • 国产编辑器EverEdit - 扩展脚本:让EverEdit支持“批量查找”功能
  • 使用 requests 和 BeautifulSoup 解析淘宝商品
  • 安利免费开源的声音克隆、文本转语音整合包软件、一键本地安装!
  • Shopify独立站开发与运营全解析
  • iOS 18.4修复多个核心安全漏洞,间接增强Find My服务的数据保护能力
  • 基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)
  • 五种音频器件综合对比——《器件手册--音频器件》
  • 【C++游戏引擎开发】《几何算法》(2):OBB射线检测
  • 【总结】SQL注入防护手段
  • 【11408学习记录】[特殊字符] 三步攻克英语长难句:嵌套结构×平行结构全解析
  • Linux中系统安全及应用
  • axios取消重复请求
  • Java基础:面向对象入门(一)
  • 【AI News | 20250403】每日AI进展
  • Java 实现 字母异位词分组
  • 5. 数据交互基础:从文本加载到向量存储的完整流程
  • Nyquist插件基础:LISP语法-运算符
  • c++基础-----c++ 成员变量初始化顺序
  • Cline – OpenRouter 排名第一的CLI 和 编辑器 的 AI 助手
  • NVR设备ONVIF接入平台搭建城乡安防网:雪亮工程智慧监管体系建设方案
  • K8s面试第一篇:初识Kubernetes——核心概念与组件详解
  • win10彻底让图标不显示在工具栏
  • 【万字总结】前端全方位性能优化指南(完结篇)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
  • dd爱框框
  • Fiddler抓取app的包
  • Design Compiler:库特征分析(ALIB)
  • Multisim14.3的安装步骤
  • 图解AUTOSAR_SWS_LINDriver
  • MySql表达式中字符串类型与整型的隐式转换