最长上升子序列(详解二分优化)

news2024/11/20 19:35:49

最长上升子序列

  • 一、题目描述
  • 二、思路分析
    • 1、问题分析
    • 2、思路分析
      • (1)状态转移方程
        • 状态表示
        • 状态转移
      • (2)循环设计
  • 三、代码实现

一、题目描述

在这里插入图片描述

二、思路分析

1、问题分析

其实这道题第一个思路就是深度优先搜索,类似于全排列的感觉,我们只需要不断地枚举出所有的情况比较出最大值即可。但是这样的时间复杂度是非常高的。

那么我们先来思考一下,如何优化?

如果采用DFS的思路来做的话,
3 , 8 1 , 2 , 8 2 , 8 8 3,8\\ 1,2,8\\ 2,8\\ 8 3,81,2,82,88
我们可以枚举出上述几个子序列,假设我们在上述子序列的后面继续添加数字的话,我们必须保证我们添加的数字是大于 8 8 8的,因为题目中要求的是最大上升子序列。也就是说,我们的下一位填什么只和当前子序列的最后一位有关系。

那么上述这四个子序列可以归结为一类,即 8 8 8为结尾的上升子序列

另外,我们发现,由于最后一位是一样的,所以他们后面所添加的数字很有可能是一样的,我们假设后面补充了相同的 n n n个数字,那么现在来看最长的依旧是当前序列中的第二个。

也就是说,在以 8 8 8为结尾的上升子序列中,只有最长的那个子序列才有可能经过后续的补充成为答案。其余情况都不如这个长。所以我们每次只需要去对以某个数 i i i结尾的子序列中最长的那个做后续的选择,其余情况不需要枚举。

经过上述的分析,我们得到两点:

1、下一个数字的选择只取决于子序列的最后一位。
2、我们只需要对具有相同最后一位的子序列中最长的子序列去进行后续的操作。

同时我们发现,一个最长子序列中包含很多子问题,因此它满足重叠子问题。其次,我们每次都是让子序列中最长的去继续枚举,也就是说我们每次只用最优解,因此,它符合最优子结构的性质。我们后续的选择,不会影响子问题的结果,因此,它也符合无后效性的性质。

综上,我们可以使用动态规划来解决,而动态规划其实本质上就是对搜索的优化,我们又恰好找到了优化的方法。所以,我们将利用我们刚刚上述的两条结论去写动态规划的代码。

2、思路分析

(1)状态转移方程

状态表示

f ( i ) f(i) f(i)表示的是以 i i i为结尾的子序列中的最长子序列的长度。

状态转移

状态转移就是用小规模的问题去表示大规模的问题。

题目中给定一个序列,我们从左边遍历,也就是说以当前数字 i i i左侧的数字结尾的最长子序列就是 f ( i ) f(i) f(i)的子问题。那么我们现在要解决的就是如何用这些子问题去表示 f ( i ) f(i) f(i),很明显,其实就是看前面的各种子序列中是否能够选上 i i i。如果子序列中的最后一个数小于 i i i,那么就能够选 i i i,此时这个序列的长度也加上了 1 1 1。然后我们在这些序列中取出一个最大值,我们就能找到以 i i i为结尾的子序列的最大值。

f ( i ) = m a x { 1 只有 i 一个元素 f ( k 1 ) + 1 k 1 < i f ( k 2 ) + 1 k 1 < i . . . f ( k 3 ) + 1 k 1 < i f(i)=max \begin{cases} 1&只有i一个元素\\ f(k1)+1 &k1<i\\ f(k2)+1 &k1<i\\ ...\\ f(k3)+1 &k1<i \end{cases} f(i)=max 1f(k1)+1f(k2)+1...f(k3)+1只有i一个元素k1<ik1<ik1<i

(2)循环设计

循环很简单,就是从左遍历序列即可。

但是我们需要注意的是,我们最终得到的是以序列中不同数字为结尾时,子序列的最大值。但是题目中并没说以哪个数字为结尾,题目只需要一个最大值,因此,需要再在这些以不同数字结尾的子序列的最大值中取出一个最大值。

为了方便,我们将利用数组的下标去写方程。

三、代码实现

#include<iostream>
using namespace std;
const int N=1010;
int dp[N],a[N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(int i=1;i<=n;i++)//从左遍历序列。
    {
        dp[i]=1;//只有一个元素a[i]的时候,子序列的长度为1,我们将其设置为默认值。
        for(int j=1;j<i;j++)//状态转移方程。
        {
           if(a[j]<a[i])
           {
               dp[i]=max(dp[j]+1,dp[i]);
           }
        }
    }
    int res = 0;//再次循环,挑出最大值。
    for (int i = 1; i <= n; i ++ ) res = max(res, dp[i]);
    cout<<res<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112014.html

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

相关文章

一维树状数组

引入 树状数组和线段树具有相似的功能&#xff0c;但他俩毕竟还有一些区别&#xff1a;树状数组能有的操作&#xff0c;线段树一定有&#xff1b;线段树有的操作&#xff0c;树状数组不一定有。但是树状数组的代码要比线段树短&#xff0c;思维更清晰&#xff0c;速度也更快&a…

设计模式-命令模式

将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作 命令模式( Command Pattern) 是对命令的封装&#xff0c;每一个命令都是一个操作&#xff1a;请求的一方 发出请求要求执行…

DIDL1_基础优化算法

基础优化算法梯度下降选择学习率小批量随机梯度下降选择批量大小Batch_size总结梯度下降 挑选一个初始值w0w_0w0​重复迭代参数 t1&#xff0c;2&#xff0c;3 wtw_twt​等于上一个时刻wt−1w_t-1wt​−1减去一个&#xff08;学习率标量和损失函数关于wt−1w_t-1wt​−1处的梯…

【20天快速掌握Python】day12-文件操作

1.文件的打开与关闭 想一想&#xff1a; 如果想用word编写一份简历&#xff0c;应该有哪些流程呢&#xff1f; 打开word软件&#xff0c;新建一个word文件 写入个人简历信息 保存文件 关闭word软件 同样&#xff0c;在操作文件的整体过程与使用word编写一份简历的过程是很相…

B树(B-树) [数据结构与算法][Java]

B树 B树又称为多路平衡树查找树, 是一种组织和维护外存文件系统非常有效的数据结构 因为我们的二分搜索树构建的时候很可能会出现不平衡的情况, 所以我们提出了自平衡二分搜索树(AVL树)对我们的普通的二分搜索树进行了一个优化, 而自平衡二分搜索树中当元素很多的时候树的高度…

Axure绘制密码输入框

当我们在绘制登录页面时&#xff0c;如果登录方式包含账号密码登录&#xff0c;那么我们就会使用到密 码输入框&#xff0c;而常见的密码输入框&#xff0c;通常会使用到小眼睛控制密码的明文和密文显示。 大家知道axure中的输入框&#xff0c;当你设置成密码类型时&#xff…

结构体内存对齐问题

结构体重点&#x1f603; 1.结构体内存对齐问题&#xff0c;是在计算结构体的大小时&#xff0c;对结构体成员在内存中的位置进行研究的问题。 废话不多说&#xff0c;先看两个例子&#xff1a; 例题1&#xff1a; struct S1 {char c1;int age;char c2; };int main() {struc…

Spring Cloud Alibaba 2022.0.0.0 版本发布啦!

01新版本预览Aliware本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本&#xff0c;是基于社区 2022.x 主干分支进行构建发布第一个 Release Candidate&#xff08;RC&#xff09;版本&#xff0c;考虑到本次版本升级属于重大版本变更&#xff0c;因此暂时先以 RC 版本形式…

如何不改一行代码,让Hippy启动速度提升50%?

导读&#xff5c;Hippy使用JS引擎进行异步渲染&#xff0c;在用户从点击到打开首屏可交互过程中会有一定的耗时&#xff0c;影响用户体验。如何优化这段耗时&#xff1f;腾讯客户端开发工程师李鹏&#xff0c;将介绍QQ浏览器通过切换JS引擎来优化耗时的探索过程和效果收益。在分…

雷神科技在北交所上市首日破发:上半年业绩下滑,路凯林为董事长

12月23日&#xff0c;青岛雷神科技股份有限公司&#xff08;下称“雷神科技”&#xff0c;BJ:872190&#xff09;在北京证券交易所&#xff08;即北交所&#xff09;上市。本次上市&#xff0c;雷神科技的发行价为25.00元/股&#xff0c;发行数量为1250万股&#xff0c;发行后总…

2023春季招聘面试集锦:MYSQL数据库高频面试题

mysql索引的数据结构&#xff0c;各自优劣 索引的数据结构和具体存储引擎的实现有关&#xff0c;在MySQL中使用较多的索引有Hash索引&#xff0c;B树索引等&#xff0c; InnoDB存储引擎的默认索引实现为&#xff1a;B树索引。对于哈希索引来说&#xff0c;底层的数据结构就是…

Dubbo(尚硅谷)学习笔记1

我们的dubbo需要一个注册中心也就是我们的zookeeper。 我们先把zookeeper搭建起来&#xff1a; 我这里是用的zookeeper3.3.4当然想用其它版本的也可以去官网去找。 我们运行这个文件&#xff1a; 第一次是会运行失败&#xff0c;所以我们还是找到这个文件 把下面的文件复制一…

小学生要学python开发游戏吗

小学生要学python开发游戏吗    小学生要学python开发游戏吗&#xff1f;为什么 而学, 到底需要如何做到, 又该如何学习. 就我个人来说, 小学生要学python开发游戏吗很有意义, 不能不说非常重大.    一般来讲, 我们都必须务必慎重的考虑考虑. 莎士比亚在不经意间这样说过&a…

qt plaintextedit使用_qt获取lineedit的内容

QLineEdit和QTextEdit都是文本框类&#xff0c;QLineEdit类是单行文本框控件&#xff0c;可以输入单行字符串。QTextEdit类是多行文本框控件&#xff0c;可以显示多行文本内容&#xff0c;当文本内容超出控件显示范围时&#xff0c;可以显示水平个垂直滚动条。QTextEdit不仅可以…

【工作流Activiti7】3、Activiti7 回退与会签

1. 回退&#xff08;驳回&#xff09; 回退的思路就是动态更改节点的流向。先遇水搭桥&#xff0c;最后再过河拆桥。 具体操作如下&#xff1a; 取得当前节点的信息取得当前节点的上一个节点的信息保存当前节点的流向新建流向&#xff0c;由当前节点指向上一个节点将当前节…

2022 年全球重大经济事件盘点( I )

2022 年&#xff0c;全球经济正面临百年未有之大变局&#xff0c;接踵而至的大事件造成今年行情剧烈波动&#xff0c;以往的投资逻辑不断遭遇修改。 正所谓阳光之下没有新鲜事。通过对于重大事件的复盘&#xff0c;分析了解过往历史脉络&#xff0c;投资者方能温故知新&#…

计算机视觉与图形学-神经渲染专题-

《Removing Objects From Neural Radiance Fields》链接&#xff1a;https://arxiv.org/pdf/2212.11966.pdf摘要神经辐射场 (NeRFs) 正逐步应用到场景表征的各个方向&#xff0c;来实现新颖视图的合成。NeRF 将越来越多内容与其他人共享。不过&#xff0c;在共享 NeRF 之前&…

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用。从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。 前言 存储器是计算机的核心部件之一,在完全理想的状态下,存…

搞定 Redis 数据存储原理,别只会 set、get 了

我的核心模块如图 1-10。 图 1-10 Client 客户端&#xff0c;官方提供了 C 语言开发的客户端&#xff0c;可以发送命令&#xff0c;性能分析和测试等。 网络层事件驱动模型&#xff0c;基于 I/O 多路复用&#xff0c;封装了一个短小精悍的高性能 ae 库&#xff0c;全称是 a si…

TIP2022|领域迁移Adaboost,让模型“选择”学哪些数据

论文下载&#xff1a;https://zdzheng.xyz/files/TIP_Adaboost.pdf 备份&#xff1a;https://arxiv.org/pdf/2103.15685.pdf 作者&#xff1a;Zhedong Zheng&#xff0c;Yi Yang 代码链接&#xff1a; GitHub - layumi/AdaBoost_Seg: TIP2022 Adaptive Boosting (AdaBoost) …