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

最长上升子序列

题目传送门

一、题目描述

给定一个长度为 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.mzph.cn/diannao/76525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 891 -- 贡献度思想

题目描述 子序列宽度之和 思路 ref 代码 相似题 子数组范围和 acwing

化工行业如何通过定制化工作流自动化实现25-30%成本优化?

作者&#xff1a;Mihir Jhaveri 编译&#xff1a;李升伟 发布日期&#xff1a;2024年10月30日 在化工生产领域&#xff0c;数字化转型正以颠覆性态势重塑产业格局。通过集成定制化软件、ERP系统、工业物联网&#xff08;IIoT&#xff09;传感网络、机器人流程自动化&#xff0…

Compose组件转换XML布局

文章目录 学习JetPack Compose资源前言&#xff1a;预览界面的实现Compose组件的布局管理一、Row和Colum组件&#xff08;LinearLayout&#xff09;LinearLayout&#xff08;垂直方向 → Column&#xff09;LinearLayout&#xff08;水平方向 → Row&#xff09; 二、相对布局 …

RAG测试数据集资源

一、通用问答基准数据集 HotpotQA 特点:包含11万+多跳问答对最佳用途:测试复杂推理能力数据示例:{"question": "Were Scott Derrickson and Ed Wood of the same nationality?","answer": "Yes, both are American" }MS MARCO 特点…

快速掌握MCP——Spring AI MCP包教包会

最近几个月AI的发展非常快&#xff0c;各种大模型、智能体、AI名词和技术和框架层出不穷&#xff0c;作为一个业余小红书博主的我最近总刷到MCP这个关键字&#xff0c;看着有点高级我也来学习一下。 1.SpringAI与functionCall简单回顾 前几个月我曾写过两篇关于SpringAI的基础…

学习笔记--(6)

import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc# 设置参数 rho 0.7798 z0 4.25 # 确保使用大写 Z0&#xff0c;与定义一致def calculate_tau(z, z_prime, rho, s_values):return np.log(rho * z * z_prime * s_values / 2)# 定义 chi_…

【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏 【AI4CODE】4 Trae 锤一个数据搬运工的小应用 1 百度 Amis 简介 百度 Amis 是一个低代码前端框架&#xff0c;由百度开源。它通过 J…

认识 Promise

认识 Promise 前言&#xff1a;为什么会出现 Promise&#xff1f; 最常见的一个场景就是 ajax 请求&#xff0c;通俗来说&#xff0c;由于网速的不同&#xff0c;可能你得到返回值的时间也是不同的&#xff0c;这个时候我们就需要等待&#xff0c;结果出来了之后才知道怎么样…

纯c++实现transformer 训练+推理

项目地址 https://github.com/freelw/cpp-transformer C 实现的 Transformer 这是一个无需依赖特殊库的 Transformer 的 C 实现&#xff0c;涵盖了训练与推理功能。 本项目使用C复刻了《Dive into Deep Learning》中关于 Transformer 的第 11 章11.7小节点内容。构建了一个英…

Go 语言规范学习(7)

文章目录 Built-in functionsAppending to and copying slicesClearCloseManipulating complex numbersDeletion of map elementsLength and capacityMaking slices, maps and channelsMin and maxAllocationHandling panicsBootstrapping PackagesSource file organizationPac…

Python Cookbook-5.1 对字典排序

任务 你想对字典排序。这可能意味着需要先根据字典的键排序&#xff0c;然后再让对应值也处于同样的顺序。 解决方案 最简单的方法可以通过这样的描述来概括:先将键排序&#xff0c;然后由此选出对应值: def sortedDictValues(adict):keys adict.keys()keys.sort()return …

Git Rebase 操作中丢失提交的恢复方法

背景介绍 在团队协作中,使用 Git 进行版本控制是常见实践。然而,有时在执行 git rebase 或者其他操作后,我们可能会发现自己的提交记录"消失"了,这往往让开发者感到恐慌。本文将介绍几种在 rebase 后恢复丢失提交的方法。 问题描述 当我们执行以下操作时,可能…

C语言基础要素(019):输出ASCII码表

计算机以二进制处理信息&#xff0c;但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’&#xff0c;显然通过键盘输入或屏幕阅读此数据而理解它为字母A&#xff0c;是比较困难的。为了有效的使用信息&#xff0c;先驱者们创建了一种称为ASCII码的交换代…

鸿蒙定位开发服务

引言 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为面向万物互联时代的分布式操作系统&#xff0c;其定位服务&#xff08;Location Kit&#xff09;为开发者提供了多场景、高精度的位置能力支持。本文将从技术原理、开发流程到实战案例&#xff0c;全面解析鸿蒙定位服务…

rknn_convert的使用方法

rknn_convert是RKNN-Toolkit2提供的一套常用模型转换工具&#xff0c;通过封装上述API接口&#xff0c;用户只需编辑模型对应的yml配置文件&#xff0c;就可以通过指令转换模型。以下是如何使用rknn_convert工具的示例命令以及支持的指令参数&#xff1a; python -m rknn.api.…

解决 axios get请求瞎转义问题

在Vue.js项目中&#xff0c;axios 是一个常用的HTTP客户端库&#xff0c;用于发送HTTP请求。qs 是一个用于处理查询字符串的库&#xff0c;通常与 axios 结合使用&#xff0c;特别是在处理POST请求时&#xff0c;将对象序列化为URL编码的字符串。 1. 安装 axios 和 qs 首先&a…

【XTerminal】【树莓派】Linux系统下的函数调用编程

目录 一、XTerminal下的Linux系统调用编程 1.1理解进程和线程的概念并在Linux系统下完成相应操作 (1) 进程 (2)线程 (3) 进程 vs 线程 (4)Linux 下的实践操作 1.2Linux的“虚拟内存管理”和stm32正式物理内存&#xff08;内存映射&#xff09;的区别 (1)Linux虚拟内存管…

torch 拆分子张量 分割张量

目录 unbind拆分子张量 1. 沿着第n个维度拆分&#xff08;即按“批次”拆分&#xff09; split分割张量 常用用法&#xff1a; 总结&#xff1a; unbind拆分子张量 import torchquaternions torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) result torch.unbind(quaternio…

【Linux】内核驱动学习笔记(二)

7、framebuffer驱动详解 7.1、什么是framebuffer (1)裸机中如何操作LCD (2)OS下操作LCD的难点 (3)framebuffer帧缓冲&#xff08;简称fb&#xff09;是linux内核中虚拟出的一个设备 (4)framebuffer向应用层提供一个统一标准接口的显示设备 (5)从驱动来看&#xff0c;fb是一个…

用 Docker Compose 与 Nginx 反向代理部署 Vikunja 待办事项管理系统

在高效管理日常任务和项目的过程中&#xff0c;开源待办事项工具 Vikunja 以其简洁、直观的设计和多视图支持受到越来越多用户的青睐。本文将详细介绍如何使用 Docker Compose 快速部署 Vikunja&#xff0c;并通过 Nginx 反向代理实现 HTTPS 访问&#xff0c;从而确保服务安全稳…