备战蓝桥杯 Day8(最长上升子序列LIS模型)

1281:最长上升子序列

【题目描述】

一个数的序列bi��,当b1<b2<...<bS�1<�2<...<��的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN)(�1,�2,...,��),我们可以得到一些上升的子序列(ai1,ai2,...,aiK)(��1,��2,...,���),这里1≤i1<i2<...<iK≤N1≤�1<�2<...<��≤�。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

【输入】

输入的第一行是序列的长度N(1≤N≤1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

【输出】

最长上升子序列的长度。

【输入样例】

7
1 7 3 5 9 4 8

【输出样例】

4

思路
状态:dp[i]--以第i个元素为结尾的最长上升子序列的长度
状态转移方程:dp[i]=max(dp[i],dp[j]+1)

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e3+10;
int a[N];
int dp[N];
int main()
{int n; cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];dp[i] = 1;}int mx = INT_MIN;for (int i = 1; i <= n; i++){for (int j = 1; j < i; j++){if (a[j] < a[i])dp[i] = max(dp[i],dp[j]+1);}mx = max(mx, dp[i]);}cout << mx;return 0;
}

1259:【例9.3】求最长不下降序列

【题目描述】

设有由n(1≤n≤200)�(1≤�≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)�(1)、�(2)、……、�(�)若存在i1<i2<i3<…<ie�1<�2<�3<…<�� 且有b(i1)<=b(i2)<=…<=b(ie)�(�1)<=�(�2)<=…<=�(��)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为77的不下降序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为88的不下降序列。

【输入】

第一行为n�,第二行为用空格隔开的n�个整数。

【输出】

第一行为输出最大个数max���(形式见样例);

第二行为max���个整数形成的不下降序列,答案可能不唯一,输出一种就可以了,本题进行特殊评测。

【输入样例】

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

【输出样例】

max=8
7 9 16 18 19 21 22 63

 思路

最长不下降子序列
1.状态  dp[i] 以第i个元素作为结尾的最长不下降子序列的长度
2.状态转移方程  if(a[j]<=a[i]) dp[i]=max(dp[i],dp[j]+1)

最后用递归打印pre数组前驱节点

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], dp[N],pre[N];
void print(int x) {if (x == 0) return;print(pre[x]);cout << a[x] << " ";
}
int main() {int n;  cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];dp[i] = 1;//边界,每一个元素自身构成最长上升}int mx = 1, maxId = 1;for (int i = 2; i <= n; i++) {//使用j遍历第i个元素之前的所有元素for (int j = 1; j < i; j++) {//找到a[j]和a[i]构成上升的情况if (a[j] <= a[i]) {//dp[i] = max(dp[i], dp[j] + 1);if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;pre[i] = j;}}}//mx = max(mx, dp[i]);if (dp[i] > mx) {mx = dp[i];maxId = i;}}cout <<"max="<< mx << endl;print(maxId);return 0;
}

1264:【例9.8】合唱队形

【题目描述】

N�位同学站成一排,音乐老师要请其中的(N−K)(�−�)位同学出列,使得剩下的K�位同学排成合唱队形。

合唱队形是指这样的一种队形:设K�位同学从左到右依次编号为1,2,…,K1,2,…,�,他们的身高分别为T1,T2,…,TK�1,�2,…,��,则他们的身高满足T1<T2<…<Ti,Ti>Ti+1>…>TK(1≤i≤K)�1<�2<…<��,��>��+1>…>��(1≤�≤�)。

你的任务是,已知所有N�位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

【输入】

输入的第一行是一个整数N(2≤N≤100)�(2≤�≤100),表示同学的总数。第二行有n�个整数,用空格分隔,第i�个整数Ti(130≤Ti≤230)��(130≤��≤230)是第i�位同学的身高(厘米)。

【输出】

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

【输入样例】

8
186 186 150 200 160 130 197 220

【输出样例】

4

【提示】

对于50%的数据,保证有n≤20�≤20;

对于全部的数据,保证有n≤100�≤100。

思路:

一个数组记录最大上升子序列长度

一个数字记录最大下降子序列的长度

最后将两个数组相加-1(i被加了两次)求最大值就是队形的长度

总的人数-队形长度即为需要出列的人数 

#include<iostream>
using namespace std;
const int N = 1e2 + 10;
int a[N], dp_up[N], dp_down[N];
int main() {int n; cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];dp_up[i] = dp_down[i] = 1;}for (int i = 1; i <= n; i++) for (int j = 1; j < i; j++) if (a[j] < a[i]) dp_up[i] = max(dp_up[j] + 1, dp_up[i]);for (int i = n; i >= 1; i--)for (int j = i+1; j <=n; j++)if (a[j] < a[i]) dp_down[i] = max(dp_down[j] + 1, dp_down[i]);int mx = 1;for (int i = 1; i <= n; i++) mx = max(dp_up[i] + dp_down[i] - 1, mx);cout << n - mx << endl;return 0;
}

1260:【例9.4】拦截导弹(Noip1999)

【题目描述】

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

【输入】

输入导弹依次飞来的高度。

【输出】

第一行:最多能拦截的导弹数;

第二行:要拦截所有导弹最少要配备的系统数。

【输入样例】

389 207 155 300 299 170 158 65

【输出样例】

6
2

思路

输出是求最长不上升子序列(有=的情况注意判断)和最长下降子序列

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e3+10;
int a[N];
int dp_up[N];
int dp_down[N];
int main()
{int x; int n = 0;while (cin >> a[++n]) {dp_down[n] = dp_up[n] = 1;}n--;//有^z会多记录一个for (int i = n; i >= 1; i--){for (int j = i + 1; j <= n; j++){if (a[j] <= a[i])dp_down[i] = max(dp_down[j]+1,dp_down[i]);}}for (int i = 1; i <=n; i++){for (int j = 1; j <= i; j++){if (a[j] < a[i])dp_up[i] = max(dp_up[j]+1,dp_up[i]);}}int mx1 = INT_MIN; int mx2 = INT_MIN;for (int i = 1; i <= n; i++){mx1 = max(mx1,dp_down[i]);mx2 = max(mx2,dp_up[i]);}cout << mx1 << endl << mx2;return 0;
}

1285:最大上升子序列和

【题目描述】

一个数的序列bi��,当b1<b2<...<bS�1<�2<...<��的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN)(�1,�2,...,��),我们可以得到一些上升的子序列(ai1,ai2,...,aiK)(��1,��2,...,���),这里1<=i1<i2<...<iK<=N1<=�1<�2<...<��<=�。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中和最大为18,为子序列(1,3,5,9)的和。

你的任务,就是对于给定的序列,求出最大上升子序列和。注意,最长的上升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和为100,而最长上升子序列为(1,2,3)。

【输入】

输入的第一行是序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。

【输出】

最大上升子序列和。

【输入样例】

7
1 7 3 5 9 4 8

【输出样例】

18

思路:求最大上升子序列长度的基础上将+i换成+a[i] 

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e3+10;
int a[N];
int dp[N];
int main()
{int n, mxSum = 0;cin >> n;for (int i = 1; i <= n; ++i)cin >> a[i];for (int i = 1; i <= n; ++i){dp[i] = a[i];for (int j = 1; j < i; ++j){if (a[i] > a[j])dp[i] = max(dp[i], dp[j] + a[i]);}}for (int i = 1; i <= n; ++i)mxSum = max(mxSum, dp[i]);cout << mxSum;return 0;}

1283:登山

【题目描述】

五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

【输入】

第一行:N (2 <= N <= 1000) 景点数;

第二行:N个整数,每个景点的海拔。

【输出】

最多能浏览的景点数。

【输入样例】

8
186 186 150 200 160 130 197 220

【输出样例】

4

思路:就是合唱队形那题一个模型

#include<iostream>
using namespace std;
#include <limits.h>
const int N=1e3+10;
int a[N];
int dp_up[N];
int dp_down[N];
int main()
{int n;cin >> n;for (int i = 1; i <= n; ++i){cin >> a[i];dp_up[i]=dp_down[i] = 1;}for (int i = 1; i <= n; ++i){for (int j = 1; j <= i; ++j){if (a[j] < a[i])dp_up[i] = max(dp_up[i], dp_up[j] + 1);}} for (int i=n;i>=1;i--){for (int j =i+1; j <=n; ++j){if (a[j] < a[i])dp_down[i] = max(dp_down[i], dp_down[j] + 1);}}int mx = 1;for (int i = 1; i <= n; i++){mx = max(mx,dp_up[i]+dp_down[i]-1);}cout << mx;return 0;}

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

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

相关文章

希尔排序算法

目录 ShellSort希尔排序 整体思路 图解分析 【1】预排序 单组排序 多组并排 【2】直接插入排序 关于gap取值 总代码实现 时间复杂度 ShellSort希尔排序 希尔排序法又称缩小增量法。 希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有…

swap交换分区及buffers和cached

swap交换分区 swap 是 linux 系统磁盘管理的一块特殊的分区&#xff0c;当实际的物理内存不足的时候&#xff0c;操作系统会从整个内存中&#xff0c;取出一部分暂时没在使用的内存&#xff0c;拿出来放到交换分区&#xff0c;从而提供给当前正在使用的程序&#xff0c;可以使…

Vue3快速上手(七) ref和reactive对比

一、ref和reactive对比 表格形式更加直观吧&#xff1a; 项目refreactive是否支持基本类型支持不支持是否支持对象类型支持支持对象类型是否支持属性直接赋值不支持&#xff0c;需要.value支持是否支持直接重新分配对象支持&#xff0c;因为操作的.value不支持&#xff0c;需…

120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭

一 nginx整体结构 1.1 master进程和worker进程概览&#xff08;父子关系&#xff09; 启动nginx&#xff0c;看到了master进程和 worker 进程。 ps -ef | grep nginx 第一列&#xff1a;进程所属的用户id 第二列&#xff1a;进程ID&#xff0c;也叫做PID&#xff0c;用来唯…

Unity中关于群组的一些组件

前言 在游戏开发环境中&#xff0c;UI组件是构建玩家交互界面的基础。以下是一些常见UI组件的详细解释和它们适用的场景&#xff0c;方便我们更好地理解和使用这些工具。 1. Graphic Raycaster Graphic Raycaster组件是游戏UI交互的核心。在Unity等游戏引擎中&#xff0c;当玩…

@arco.design Modal renderContent 增加样式

方式一&#xff1a;通过 h 函数 import { h } from vueMessage.error({content: () > {return h(div, {}, [手机号 , h(span, { style: { color: red } }, staffPhone), 已存在])}, })方式二&#xff1a;通过 jsx 方式 注意&#xff1a;lang 需要改为 jsx 或者 tsx <s…

JS面向对象:八.原型链的问题

<!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>原型链的问题</title> </head> <body> <script>function Humans(){this.clothing["trousers","dress",&…

OSQP文档学习

OSQP官方文档 1 QSQP简介 OSQP求解形式为的凸二次规划&#xff1a; x ∈ R n x∈R^n x∈Rn&#xff1a;优化变量 P ∈ S n P∈S^n_ P∈Sn​&#xff1a;半正定矩阵 特征 &#xff08;1&#xff09;高效&#xff1a;使用了一种自定义的基于ADMM的一阶方法&#xff0c;只需…

java当日时间段获取

需求&#xff1a;获取当天日期到当前访问的时间段&#xff0c;如当日是2024-02-19&#xff0c;那么此刻访问&#xff0c;日期期间就是2024-02-19 00:00:00到2024-02-19 16:58:00 代码如下&#xff1a; Date datenew Date();String currentDatedate2Str(date,"yyyy-MM-dd&q…

关于Sora的一些紧迫问题...

OpenAI Sora 概述 OpenAI最新的创新&#xff0c;Sora&#xff0c;在人工智能领域开辟了新的天地。Sora是一个文本到视频的扩散模型&#xff0c;可以将文本描述转化为逼真的视频内容。它解决了一个重大的技术挑战&#xff0c;即在视频中保持主体的一致性&#xff0c;即使它们暂…

Java 线程池的基本操作

Java 线程池的基本操作 package com.zhong.thread.threadpool;import java.util.concurrent.*;/*** ClassName : ThreadPool* Description : 线程池的基本操作* Author : zhx* Date: 2024-02-19 18:03*/ public class ThreadPool {public static void main(String[] args) {// …

C语言每日一题(59)左叶子之和

题目链接 力扣网404 左叶子之和 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 2…

基于SpringBoot的高校竞赛管理系统

基于SpringBoot的高校竞赛管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 管理员界面 老师界面 摘要 高校竞赛管理系统是为了有效管理学校…

低代码开发与网络信息安全:构建高效防护体系

随着数字化转型的加速&#xff0c;越来越多的企业开始关注低代码开发平台&#xff0c;以提高软件开发效率&#xff0c;缩短上市时间。然而&#xff0c;随之而来的网络信息安全问题也日益严峻。如何在享受低代码开发带来的便捷与高效的同时&#xff0c;确保网络信息安全成为企业…

K8s进阶之路-命名空间级-服务发现 :

服务发现&#xff1a; Service&#xff08;东西流量&#xff09;&#xff1a;集群内网络通信、负载均衡&#xff08;四层负载&#xff09;内部跨节点&#xff0c;节点与节点之间的通信&#xff0c;以及pod与pod之间的通信&#xff0c;用Service暴露端口即可实现 Ingress&#…

Vscode python pyside6 制作视频播放器

一、界面如下 包含控件 qcombox、qtablewidget、qpushbotton、qverticalslider 二、运行代码 media_player.py import sysfrom PySide6 import QtWidgets from PySide6.QtWidgets import * from PySide6.QtMultimedia import * from PySide6.QtMultimediaWidgets import QVi…

林浩然与杨凌芸的Java List大冒险

林浩然与杨凌芸的Java List大冒险 Lin Haoran and Yang Lingyun’s Java List Adventure 在一个阳光明媚的日子&#xff0c;程序员界的“侠客”林浩然和他那聪明伶俐的同事兼好友杨凌芸正在Java王国里进行一场别开生面的大冒险。这次他们的目标是征服两个强大的List家族成员——…

c++面试

c基础 面试题 1&#xff1a;变量的声明和定义有什么区别 1.定义:为变量分配地址和存储空间&#xff0c;声明:不分配地址。 2.一个变量可以在多个地方声明&#xff0c;但是只在一个地方定义。 3.加入 extern 修饰的是变量的声明&#xff0c;说明此变量将在文件以外或在文件后…

备战蓝桥杯 Day4

目录 注意&#xff1a;递推开long long 1140&#xff1a;验证子串 1131&#xff1a;基因相关性 1176&#xff1a;谁考了第k名 1177&#xff1a;奇数单增序列 1180&#xff1a;分数线划定 1184&#xff1a;明明的随机数 1185&#xff1a;单词排序 1186&#xff1a;出现…

图论之dfs与bfs的练习

dfs--深度优选搜索 bfs--广度优先搜索 迷宫问题--dfs 问题&#xff1a; 给定一个n*m的二维迷宫数组其中S是起点&#xff0c;T是终点&#xff0c;*是墙壁&#xff08;无法通过&#xff09;&#xff0c; .是道路 问从起点S出发沿着上下左右四个方向走&#xff0c;能否走到T点&a…