最长上升子序列c++

题目

输入样例:

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

输出样例:

复制代码
4
思路

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

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

  1. 状态表示:

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

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

集合属性(即f[i]存的值):最大长度。

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

  1. 状态计算:

这一步我们思考如何把每个f[i]求出来。

要计算以f[i]结尾的最长上升子序列,那么我们可以利用在a[i]这个数之前算过的最长上升子序列f[j],如果a[j] 小于 a[i],说明a[i] 是可以放到a[j]后面 成为一条长度为f[j] + 1的上升子序列的。如果a[i]能放到多条f[j]后面,那么以a[i]结尾的最长上升子序列为f[i] = max(f[i], f[j] + 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;
}
相关推荐
luanma15098021 分钟前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默23 分钟前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
csdn_aspnet31 分钟前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
Boop_wu1 小时前
[Java 算法] 动态规划(1)
算法·动态规划
kyriewen111 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy2 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt
豆豆的java之旅2 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
sthnyph2 小时前
QT开发:事件循环与处理机制的概念和流程概括性总结
开发语言·qt
大尚来也2 小时前
Java 反射:从“动态魔法”到生产实战的避坑指南
开发语言
无心水3 小时前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理