最长上升子序列问题

题目:1014. 登山

思路

First

这题也可以看作最长上升子序列,只不过这个序列有三种情况。

  1. 先上升,后下降
  2. 先上升,不下降
  3. 不上升,直接下降

其实这三种情况我们可以归纳为一种情况先上升后下降。先上升不下降的可以看成”先上升后下降为零“;不上升直接下降可以看成”先上升零后下降

我们可以参考直接的母题模板。

  1. 定义:f[i]表示以该点为中的终点的最长上升子序列的最大长度,a[i]表示以该点为起点的最长下降子序列(终点是整个序列的最后一个元素)
  2. 运用之前的模板,把以每一个点为终点的最长上升子序列最大长度和以其为起点的最长下降子序列最大长度求解处理(即f[]a[]求解)
  3. 遍历循环每一个点,我们将该点作为上升和下降的转折点(在该点之前上升,在该点之后下降),即a[i]+f[i],然后我们求出最大的那个即为答案。注意,由于这个点被加了两次,所以最后要减去一次。

Second

上面的那种思路非常好想到,这题还有一种思路。

我们可以利用状态机模型DP解决最长xxx子序列模型的方法(这个状态机模型我也不是很清楚,是在题解上看到大佬写的,等以后刷的题多了应该会了解的)。

xxx可以是先上升后下降,或者先上升后下降再上升,或者先上升后下降再上升再下降 ···

对于本题来说,如果当前状态是上升,那么它的下一阶段可以维持上升状态,也可以变成下降状态;而如果当前状态是下降状态,那么它下一阶段就只能维持下降状态。

  1. 定义:f[i][k]表示以i为终点,当前状态是k最大方案子序列长度。
  2. 初始状态:f[0][0]f[0][1],目标状态:f[n-1][0]f[n-1][1]
  3. 状态转移:遍历循环每一个点,对于每一个节点i,我们接着枚举每一个在i前面的节点j,这样有两种情况(由于题目说明了不浏览海拔相等的,所以就不考虑相等的情况):
  • 如果p[j]<p[i],那么节点i只能由节点j的上升状态转移而来。
  • 如果P[j]<p[i],那么节点i既可以由节点j的上升状态转移而来也可以由j的下降状态转移而来。
  1. 最后,我们只需要比较每一个节点的f[i][0]f[i][1],找到最大的即是答案。

代码

First
#include<iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n;
	cin >> n;
	int p[1010], f[1010], a[1010];
	for (int i = 1; i <= n; i++)
	{
		f[i] = 1;
		a[i] = 1;
		cin >> p[i];
	}

	int res = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
			if (p[i] > p[j])
				f[i] = max(f[i], f[j] + 1);
	}
	
	for (int i = n; i > 0; i--)
		for (int j = n; j > i; j--)
			if (p[i] > p[j])
				a[i] = max(a[i], a[j] + 1);
	
	for (int i = 1; i <= n; i++)
		res = max(res, f[i] + a[i]-1);

	cout << res << endl;
}

Second
#include<iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n, p[1010], f[1010][2];
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		f[i][0] = f[i][1] = 1;
		cin >> p[i];
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
		{
			if (p[j] < p[i])
				f[i][0] = max(f[i][0], f[j][0] + 1);
			if (p[j] > p[i])
				f[i][1] = max(f[i][1], max(f[j][0], f[j][1]) + 1);
		}
	}

	int res = 1;
	for (int i = 1; i <= n; i++)
		res = max(max(f[i][1], f[i][0]), res);
	cout << res << endl;
}

题目:482. 合唱队形

思路:

和上一题一模一样

代码

#include<iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n, p[1010], f[1010][2];
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		f[i][0] = f[i][1] = 1;
		cin >> p[i];
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
		{
			if (p[j] < p[i])
				f[i][0] = max(f[i][0], f[j][0] + 1);
			if (p[j] > p[i])
				f[i][1] = max(f[i][1], max(f[j][0], f[j][1]) + 1);
		}
	}

	int res = 1;
	for (int i = 1; i <= n; i++)
		res = max(max(f[i][1], f[i][0]), res);
	cout << n - res << endl;
}

#include<iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n;
	cin >> n;
	int p[1010], f[1010], a[1010];
	for (int i = 1; i <= n; i++)
	{
		f[i] = 1;
		a[i] = 1;
		cin >> p[i];
	}

	int res = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
			if (p[i] > p[j])
				f[i] = max(f[i], f[j] + 1);
	}

	for (int i = n; i > 0; i--)
		for (int j = n; j > i; j--)
			if (p[i] > p[j])
				a[i] = max(a[i], a[j] + 1);

	for (int i = 1; i <= n; i++)
		res = max(res, f[i] + a[i] - 1);

	cout << n - res << endl;
}

写在最后

个人亲身经验:我们学习的一系列Linux命令,一定要自己亲手去敲。不要只是看别人敲代码,不要只是停留在眼睛看,脑袋以为自己懂了,等你实际上手去敲会发现许许多多的这样那样的问题。毕竟“实践出真知”。


如果你觉得我写的题解还不错的,请各位王子公主移步到我的其他题解看看

  1. 数据结构与算法部分(还在更新中):
  • C++ STL总结 - 基于算法竞赛(强力推荐)
  • 动态规划——01背包问题
  • 动态规划——完全背包问题
  • 动态规划——多重背包问题
  • 动态规划——分组背包问题
  • 动态规划——最长上升子序列(LIS)
  • 二叉树的中序遍历(三种方法)
  • 最长回文子串
  • 最短路算法——Dijkstra(C++实现)
  • 最短路算法———Bellman_Ford算法(C++实现)
  • 最短路算法———SPFA算法(C++实现)
  • 最小生成树算法———prim算法(C++实现)
  • 最小生成树算法———Kruskal算法(C++实现)
  • 染色法判断二分图(C++实现)
  1. Linux部分(还在更新中):
  • Linux学习之初识Linux
  • Linux学习之命令行基础操作
  • Linux学习之基础命令(适合小白)
  • Linux学习之权限管理和用户管理
  • Linux学习之制作静态库和动态库
  • Linux学习之makefile
  • Linux学习之系统编程1(关于读写系统函数)
  • Linux学习之系统编程2(关于进程及其相关的函数)
  • Linux学习之系统编程3(进程及wait函数)
  • Linux学习之系统编程4(进程间通信)
  • Linux学习之系统编程5(信号)
  • Linux学习之系统编程6(线程)
  • Linux学习之系统编程7(线程同步/互斥锁/信号量/条件变量)
  • Linux学习之网络编程(纯理论)
  • Linux学习之网络编程2(socket,简单C/S模型)

✨🎉总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
在这里插入图片描述
如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之多态(二)

一.抽象类 纯虚函数&#xff1a;在虚函数后面加上0就是纯虚函数 作用&#xff1a;纯虚函数规范了派生类必须重写&#xff0c;另外纯虚函数更体现出了接口继承 抽象类定义&#xff1a; 包含纯虚函数的类叫做抽象类&#xff08;也叫接口类&#xff09;&#xff0c;抽象类不能…

Scikit-Learn K近邻分类

Scikit-Learn K近邻分类 1、K近邻分类1.1、K近邻分类及原理1.2、超参数K1.3、K近邻分类的优缺点2、Scikit-Learn K近邻分类2.1、Scikit-Learn K近邻分类API1、K近邻分类 K近邻是一种常用的分类算法。K近邻在机器学习知识结构中的位置如下: 1.1、K近邻分类及原理 K近邻(K-Near…

GoogLeNet论文学习笔记

题目&#xff1a;Going deeper with convolutions 下载地址&#xff1a;GoogLeNet论文 代码&#xff1a;GoogLeNet代码 GoogLeNet在2014年的ISCRC分类比赛中第一名。 创新点 引入Inception结构&#xff08;融合不同尺度的特征信息&#xff09;&#xff1b; 使用1*1的卷积核…

AI:Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略

AI&#xff1a;Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略 目录 Nvidia官网人工智能大模型工具合集的简介 1、网站主要功能包括: Nvidia官网人工智能大模型工具合集的使用方法 1、SDXL-Turbo的使用 2、GEMMA-7B的…

全志A33编译踩坑!

领导给了个新sdk。然后开编。 编译的标准流程是这样 cd lichee ./build.sh config 这还得了&#xff0c;每次都选很烦&#xff08;虽然只需要选一次&#xff09;&#xff0c;于是新写法是这样 ./build.sh -p sun8iw5p1_android -k linux-3.4 -b evb 果断提示 ERROR: inv…

Intellij IDEA构建Android开发环境

Intellij IDEA创建项目时没有Android的选项 进设置&#xff08;Intellij IDEA - Settings - Plugins &#xff09;

vue-cli5多入口项目分项目编译打包并部署nginx

项目准备 假设有两个项目A和B&#xff0c;我们希望访问localhost:9000/projectA来访问项目A&#xff0c;访问localhost:9000/projectB来访问项目B. 项目结构 项目配置 vue.config.js var projectname process.argv[3] function getEntry() {var entries {}if (process.en…

网站升级https教程

现在越来越多的网站开始升级https协议&#xff0c;其实早在2014年百度就已经开始支持https协议了&#xff0c;且对于在开启了https的网站会增加其搜索权重&#xff0c;意思是在同类网站中&#xff0c;开启了https的网站搜索排名会增加优先度&#xff0c;搜索到的排名也会增加&a…

Netty学习——源码篇6 Pipeline设计原理

1 Pipeline设计原理 在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应&#xff0c;它们的组成关系如下图&#xff1a; 通过上图可以看到&#xff0c;一个Channel包含了一个ChannelPipeline&#xff0c;而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的…

云数据库认识

云数据库概述 说明云数据库厂商概述Amazon 云数据库产品Google 的云数据库产品Microsoft 的云数据库产品 云数据库系统架构UMP 系统概述UMP 系统架构MnesiaRabbitMQZooKeeperLVSController 服务器Proxy 服务器Agent 服务器日志分析服务器 UMP 系统功能容灾 读写分离分库分表资源…

PyCharm环境下Git与Gitee联动:本地与远程仓库操作实战及常见问题解决方案

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言下载及安装GitGit的使用设置用户签名设置用户安全目录Git基本操作Git实操操作 Pyc…

设置远程访问 jupyter Notebook Lab

安装Anaconda / Miniconda 进入conda环境&#xff0c;安装jupyter https://jupyter.org/install 生成notebook config C:\Users\***>jupyter notebook --generate-config Writing default config to: C:\Users\***\.jupyter\jupyter_notebook_config.py创建密码 jupyter…

教你怎样根据空行分割TXT文本文档 TXT文本分割 文本拆分实例

比如有一些文本中间用多个空行隔开&#xff0c;需要把隔开的文本分别保存&#xff0c;比如我们要把隔2行或以上空行的文本分别保存成一个文档&#xff0c;如图&#xff1a; 实现方法&#xff1a; 1、先打开首助编辑高手软件&#xff0c;进入【文本批量操作】--【拆分文本】&am…

Gin中的gin.Context与Golang原生的context.Context区别与联系

一.gin中的context gin.Context 1.概念 在 Gin 中&#xff0c;Context 是一个非常重要的概念&#xff0c;它是Gin的核心结构体之一,用于处理 HTTP 请求和响应,在 Gin 的处理流程中&#xff0c;Context 贯穿整个处理过程&#xff0c;用于传递请求和响应的信息Gin 的 Context 是…

python进阶:装饰器

装饰器本质上是一个Python函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景&#xff0c;比如&#xff1a;插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是…

【python】获取4K壁纸保存到本地文件夹【附源码】

图片信息丰富多彩&#xff0c;许多网站上都有大量精美的图片资源。有时候我们可能需要批量下载这些图片&#xff0c;而手动一个个下载显然效率太低。因此&#xff0c;编写一个简单的网站图片爬取程序可以帮助我们高效地获取所需的图片资源。 目标网站&#xff1a; 如果出现模…

软件开发困境

软件开发的困境开发者的困境人月神话 布鲁克斯的核心观点包括&#xff1a; EAI &#xff08;企业应用集成&#xff09; 通过EAI&#xff0c;企业能够实现以下功能&#xff1a;实例介绍 信息孤岛软件开发有没有“银弹”&#xff1f; 软件开发的困境 在软件开发过程中&#xff0…

FPGA时钟资源详解(3)——全局时钟资源

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 一、概述 全局时钟是 FPGA 中的一种专用互连网络&#xff0c;旨在将时钟信号分配到 FPGA 内各种资源的时钟输入处。这种设计…

ARM IHI0069F GIC architecture specification (4)

1.3 支持的配置和兼容性 在 Armv8-A 中&#xff0c;EL2 和 EL3 是可选的&#xff0c;PE 可以支持一个、两个或都不支持这些异常级别。 然而&#xff1a; • PE 要求EL3 支持安全和非安全状态。 • PE 需要EL2 来支持虚拟化。 • 如果未实施EL3&#xff0c;则只有一个安全状态。…

Mysql数据库——数据备份与恢复

目录 一、数据备份的重要性 二、数据库备份的分类 1.从物理与逻辑的角度分类 2.从数据库的备份策略角度&#xff0c;备份可分为 2.1完全备份 2.2差异备份 2.3增量备份 2.4总结 三、常见的备份方法 四、Mysql数据库完全备份 1.完全备份定义 2.优缺点 3.数据库完全备…