最长上升子序列c++

题目

输入样例:

复制代码
7
3 1 2 1 8 5 6

输出样例:

复制代码
4
思路

题目求最大长度,考虑使用DP来做。我们从状态表示和状态计算两方面进行分析。

假设用a数组来存序列,f数组来存以fi结尾的最长上升子序列。

  1. 状态表示:

这一步我们思考如何定义集合。

集合f(i)定义:以fi结尾的所有序列。

集合属性(即fi存的值):最大长度。

因为题目要求最长上升子序列,通过这样定义集合,我们可以枚举所有序列,并可以求出所有以fi结尾的最长上升子序列,那我们就可以fi中选出一个最大的作为答案了。

  1. 状态计算:

这一步我们思考如何把每个fi求出来。

要计算以fi结尾的最长上升子序列,那么我们可以利用在ai这个数之前算过的最长上升子序列fj,如果aj 小于 ai,说明ai 是可以放到aj后面 成为一条长度为fj + 1的上升子序列的。如果ai能放到多条fj后面,那么以ai结尾的最长上升子序列为fi = max(fi, fj + 1)。

代码
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N], f[N];

int main()
{
  int n;
  cin >> n;
  
  for (int i = 1; i <= n; i ++)
  cin >> a[i];
  
  int res = 1;
  for (int i = 1; i <= n; i ++)
  { f[i] = 1;
    for (int j = i - 1; j >= 0; j --)
    if (a[i] > a[j])
    f[i] = max(f[i], f[j] + 1);
    
    res = max(res, f[i]);
  }
  
  cout << res;
  return 0;
}
相关推荐
djarmy1 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO91 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精1 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠2 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫2 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141912 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉2 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
零衣贰2 小时前
The 2026 ICPC Asia East Continent Online Contest (I) 题解
c++·icpc
秦老师Q3 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php