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

【动态规划入门】最长上升子序列

每日一道算法题之最长上升子序列

  • 一、题目描述
  • 二、思路
  • 三、C++代码

一、题目描述

题目来源:LeetCode

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

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

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

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

示例如下:

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

二、思路

  按照动态规划的解题步骤,来进行分析:

  1. dp[i]的定义
    dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
  2. 确定状态转移方程
    位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
    所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
  3. dp[i]的初始化
    每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.
  4. 确定遍历顺序
    dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。j其实就是遍历0到i-1,那么是从前到后,还是从后到前遍历都无所谓,只要把 0 到 i-1 的元素都遍历了就行了。 所以默认习惯 从前向后遍历。

三、C++代码

#include<bits/stdc++.h>
using namespace std;#define maxn 1010
int dp[maxn];   //dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
int nums[maxn] ; //记录整数数组 
int main(){int n;cin >> n;for(int i = 1; i <= n; i ++) {cin >> nums[i];}for(int i = 1; i <= n; i ++){dp[i] = 1;for(int j = 1; j < i; j ++){if(nums[j] < nums[i]) dp[i] = max(dp[i], dp[j] + 1);}}int ans = 0;for(int i = 1; i <= n; i ++) ans = max(ans, dp[i]);cout << ans << endl;} 
http://www.lryc.cn/news/311555.html

相关文章:

  • LabVIEW眼结膜微血管采集管理系统
  • 通过GitHub探索Python爬虫技术
  • 【Python】-----基础知识
  • 如何学习、上手点云算法(二):点云处理相关开源算法库、软件、工具
  • 为什么会对猫毛过敏?如何缓解?浮毛克星—宠物空气净化器推荐
  • Linux学习-etcdctl安装
  • Qt应用软件【文件篇】读写文件技巧
  • GO常量指针
  • 微服务间通信重构与服务治理笔记
  • unity 场景烘焙中植物叶片(单面网络)出现的白面
  • 网工内推 | 国企运维,年薪最高30W,RHCE认证优先
  • WordPress排除调用某个分类下的文章
  • Java多线程——信号量Semaphore是啥
  • L2785(Java). 将字符串中的元音字母排序
  • Android之Handler原理解析与问题分享
  • YOLO快速入门
  • 基于 LLaMA 和 LangChain 实践本地 AI 知识库
  • GraphGeo参文2:Fourth-Order Runge–Kutta(四阶RK方法)
  • 解密Lawnchair:打造个性化极致的Android桌面体验
  • c语言-函数-009
  • Spring事件发布监听器ApplicationListener原理- 观察者模式
  • 系统学习Python——装饰器:直接管理函数和类
  • Leetcode 3049. Earliest Second to Mark Indices II
  • CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版
  • 算法设计.
  • 20240304金融读报:票据贴现数据挖掘与新质生产力信贷创新
  • 05. Nginx入门-Nginx访问控制
  • S2---FPGA-A7板级原理图硬件实战
  • RK DVP NVP6158配置 学习
  • C++基础2:C++基本数据类型和控制结构