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

动态规划DP 最长上升子序列模型 最长上升子序列(题目分析+C++完整代码)

概览检索
动态规划DP 最长上升子序列模型

最长上升子序列

原题链接

AcWing 895. 最长上升子序列

题目描述

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

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

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

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

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

题目分析

闫氏DP分析法

在这里插入图片描述

集合的划分

以a[k]为例,则第k类中的上升子序列:
···a[k],a[i]
···a[k],a[i]
···
···a[k],a[i]
有很多组以a[k]为倒数第二个数,a[i]为结尾的序列,而其中的最长序列即为**···到a[k]的最大值max 再加上1(a[i]),即等价为 f[a[k]] +1**。
在这里插入图片描述

可知,f[i]则取所有a[i]结尾中长度最长的序列即可
在这里插入图片描述

完整代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int n;
int a[N],f[N];  //a存储原始数据,f存储状态
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    //遍历以a[i]结尾的序列
    for(int i=1;i<=n;i++){
        f[i]=1;  //该序列中只有a[i],以a[i]结尾,长度为1
        //遍历在以a[i]结尾的序列下,倒数第二个数(即前一个数)为a[j]的序列
        for(int j=1;j<i;j++)
            if(a[j]<a[i])  //如果满足递增(前一个个数a[j]大于当前数a[i])
                f[i]=max(f[i],f[j]+1);  //则进行更新,取最大值
    }
    int res=0;
    //遍历以a[0]~a[n]结尾的最大上升子序列,其中的最大值即为所求值
    for(int i=1;i<=n;i++) res=max(res,f[i]);
    printf("%d",res);
    return 0;
}

http://www.kler.cn/a/525227.html

相关文章:

  • SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明
  • IME关于输入法横屏全屏显示问题-Android14
  • C++入门(1)
  • gesp(C++六级)(6)洛谷:P10109:[GESP202312 六级] 工作沟通
  • OpenHarmony 5.0.2 Release来了!
  • Python实现U盘数据自动拷贝
  • Android NDK
  • “AI视频智能分析系统:让每一帧视频都充满智慧
  • 寻找旋转数组中的最小元素:C语言实现与分析
  • SSM开发(七) MyBatis解决实体类(model)的字段名和数据库表的列名不一致方法总结(四种方法)
  • Baklib引领企业内容中台建设的新思路与应用案例
  • 更新被联想限制更新的intel集成显卡UHD 630驱动,想让老显卡也支持到4K显示器
  • pandas(一)创建文件、写入数据
  • Brave132 编译指南 Windows 篇:获取源码(六)
  • Git进阶之旅:Git 配置信息 Config
  • Mybatis是如何进行分页的?
  • Vue.js 什么是 Composition API?
  • MySQL知识点总结(十一)
  • 【数据结构】动态内存管理函数
  • 小程序-视图与逻辑
  • Ansible自动化运维实战--fetch、cron和group模块(5/8)
  • 微调Qwen2:7B模型,加入未知信息语料
  • WPF基础03——InitializeComponent()函数解释
  • Microsoft Power BI:融合 AI 的文本分析
  • Yii框架中的扩展:如何使用外部库
  • 《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记