子序列问题集合

子序列问题

  • 删除一次得到的最大和
  • 最大子数组和
  • 最长公共子序列:
  • 最长上升子序列(要输出序列,和最大长度)
    • 1.dp
    • 2.贪心+二分
  • 导弹拦截 (最长上升/下降子序列长度)

删除一次得到的最大和

在这里插入图片描述

class Solution {
public:
/*
left[i]:以i为结尾的子数组的最大和
right[i]:以i为开始的子数组的最大和
*/int maximumSum(vector<int>& arr) {int n=arr.size();vector<int> left(n),right(n);left[0]=arr[0],right[n-1]=arr[n-1];int ans=left[0];for(int i=1;i<n;i++){left[i]=max(left[i-1],0)+arr[i];right[n-i-1]=max(right[n-i],0)+arr[n-i-1];ans=max(ans,left[i]);}for(int i=1;i<n-1;i++)ans=max(ans,left[i-1]+right[i+1]);return ans;}};

最大子数组和

在这里插入图片描述

class Solution {
public:
/*
dp[i]:以i为结尾的连续子数组的最大和
dp的子问题定义要无后效性,同时满足题意;以i为结尾,这样能够保证
在判断i位置时,dp[i-1]是连续的,这样连上i才有意义,同时当dp[i-1]已经小于0,那么前面这些子数组就没有必要加上了,其对后面可能出现的最大子数组和没有贡献
dp[n-1]不是结果,不是最大和
*/int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int> dp(n,0);dp[0]=nums[0];for(int i=1;i<n;i++){if(dp[i-1]>0)dp[i]=dp[i-1]+nums[i];elsedp[i]=nums[i];}return *max_element(dp.begin(),dp.end());}
};

最长公共子序列:

在这里插入图片描述


class Solution {
public://dfs(i,j)代表s串i前字符和t串j前个字符,的公共子序列长度//假设最长公共子序列是lcs,则当s[i]==t[j]时,那么公共子序列长度因该是+1//不同时,如果s[i]在lcs中则dfs(i,j-1),  否则t[j]在lcs中则dfs(i-1,j)//也有可能s[i]和t[j]都不在lcs中,那么就是dfs(i-1,j-1)//但是显然这个能构造出来的最长公共子序列是小于上面两个的// int dfs(string& s,string& t,int i,int j)// {//     if(i<0||j<0)return 0;//     if(s[i]==t[j])//     return dfs(s,t,i-1,j-1)+1;//     else//     return max(dfs(s,t,i-1,j),dfs(s,t,i,j-1));// }//     int longestCommonSubsequence(string s, string t) {//         return dfs(s,t,s.size()-1,t.size()-1);//     }// };这样朴素的暴搜,显然会超时,并且可以很直观的发现,这里进行了很多重复的操作//用二维数组记录之前的结果,dfs+记忆化int cache[1005][1005];int dfs(string& s, string& t, int i, int j){if (i < 0 || j < 0)return 0;int& ans = cache[i][j];if (ans != 0)return ans;//不为0说明已经确定过这个值了,不必dfsif (s[i] == t[j])return ans = dfs(s, t, i - 1, j - 1) + 1;elsereturn ans = max(dfs(s, t, i - 1, j), dfs(s, t, i, j - 1));//return dfs(s,t,i,j);}int longestCommonSubsequence(string s, string t) {return dfs(s, t, s.size() - 1, t.size() - 1);}
};

最长上升子序列(要输出序列,和最大长度)

在这里插入图片描述
两种解法:

1.dp

#include<bits/stdc++.h>
using namespace std;/*
* 最长不下降子序列
* 1.状态描述
* dp[i]:是以i为结尾的最长不下降子序列的长度
* 2.状态转移方程
* if(a[i]>=a[j]) dp[i]=max(dp[i],dp[j]+1);
* j是i之前的元素
*/int n, a[201], dp[201], pre[201];void reverse_print(int index)
{if (index == -1)return;reverse_print(pre[index]);cout << a[index] << " ";
}/*14
13 7 9 16 38 24 37 18 44 19 21 22 63 15*/int main()
{memset(pre, -1, sizeof(pre));cin >> n;for (int i = 0; i < n; i++){cin >> a[i];dp[i] = 1;//初始化}int maxx = 1;//最大长度至少都是1int maxIndex = 0;for (int i = 1; i < n; i++){for (int j = 0; j < i; j++){/*if (a[i] >= a[j])//如果只是求解序列长度,这样即可,但是要去找到这个序列,那还需要去记录其前驱dp[i] = max(dp[i], dp[j] + 1);maxx = max(maxx, dp[i]);*/if (a[i] >= a[j]){if (dp[j] + 1 > dp[i])//说明以j为前驱时,会得到更长的序列,此时更新pre[i]{dp[i] = dp[j] + 1;pre[i] = j;}}if (dp[i] > maxx){maxx = dp[i];maxIndex = i;}}}std::cout << "max=" << maxx << endl;reverse_print(maxIndex);return 0;
}

2.贪心+二分

/*解法一:贪心+二分 */
class Solution {
public:int low_bound(vector<int>& arr, int key)//去找一个最小的大于key的{int left = 0, right = arr.size();while (left < right){int mid = (left + right) / 2;if (arr[mid] < key)left = mid + 1;else if (arr[mid] > key)//当mid大于key时,不是让right=mid-1;因为有可能此时的mid就是最小的大于key的right = mid;}return right;}int lengthOfLIS(vector<int>& nums) {vector<int> ret;//ret[i]表示长度为i+1的子序列的最小值/*我尽可能让这个子序列的末尾元素小,这样后面更多的元素才可能加入*/ret.push_back(nums[0]);//一个必然升序for (int i = 1, k = 1; i < nums.size(); i++)//k是此时ret中有多少个元素,作为下标使用k-1{if (nums[i] > ret[k - 1])//大于ret的结尾,ret的结尾是ret中的最大的,直接加入{ret.push_back(nums[i]);k++;}else if (nums[i] < ret[k - 1])//遇到小于,则往前去找一个最小的并且大于的num[i]的ret{int pos = low_bound(ret, nums[i]);//这里使用二分,提高效率//cout << "pos=" << pos << endl;//if (ret[pos] == nums[i])continue;ret[pos] = nums[i];}}return ret.size();}
};

导弹拦截 (最长上升/下降子序列长度)

在这里插入图片描述

/*
* 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。389 207 155 300 299 170 158 656
2其实就是去求这个序列的最长上升子序列的长度,和最长下降子序列的长度
*/#include<bits/stdc++.h>
using namespace std;int n = 1, a[1001], dp_up[1001], dp_down[1001];
int main()
{while (cin >> a[n]){dp_up[n] = dp_down[n] = 1;n++;}n--;int max_down = 1, max_up = 1;for (int i = 2; i <= n; i++){for (int j = 1; j < i; j++){if (a[i] > a[j])dp_up[i] = max(dp_up[i], dp_up[j] + 1);if (a[i] <= a[j])dp_down[i] = max(dp_down[i], dp_down[j] + 1);}max_down = max(max_down, dp_down[i]);max_up = max(max_up, dp_up[i]);}cout << max_down << endl << max_up << endl;return 0;
}

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

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

相关文章

Elasticsearch基础篇(二):Elasticsearch在windows和liunx上的安装部署

Elasticsearch简介 前言1. Windows环境部署Elasticsearch1.1 下载并解压Elasticsearch压缩包1.2 命令行启动elasticsearch1.3 验证是否成功启动elasticsearch1.4 关闭Elasticsearch1.5 在Windows上安装Elasticsearch作为服务 2. Liunx环境部署Elasticsearch安装 Elasticsearch …

Android Studio 的android.jar文件在哪儿

一般在&#xff1a;C:\Users\admin\AppData\Local\Android\Sdk\platforms\android-33下&#xff08;不一定是33&#xff0c;这个得看你Android Studio->app->builde.gradle的targetSdk是多少&#xff09; 怎么找&#xff1a; 1.打开Android Studio 粘贴地址后&#xff0…

UE学习记录07----C++中使用事件委托

1.c定义多播委托&#xff0c;示例代码&#xff1a; #include "Delegates/Delegate.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyDelegate, UObject*, SelectAgent);/****/ UCLASS(Blueprintable, DisplayName "VM_PlaceEntity") class PR_PLACEE…

在nodejs中如何防止ssrf攻击

在nodejs中如何防止ssrf攻击 什么是ssrf攻击 ssrf&#xff08;server-side request forgery&#xff09;是服务器端请求伪造&#xff0c;指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)…

word 多级目录的问题

一、多级标题自动编号 --> 制表符 -> 空格 网址&#xff1a; 【Word技巧】2 标题自动编号——将多级列表链接到样式 - YouTube 二、多级列表 --> 正规形式编号 网址&#xff1a;Word 教学 - 定框架&#xff1a;文档格式与多级标题&#xff01; - YouTube 三、目…

【项目】基于C++11实现的数据库连接池

文章目录 前置知识关键技术点项目背景连接池功能点介绍MySQL Server参数介绍功能设计连接池功能点介绍开发平台选型 关于MySQL数据库编程MySQL接口介绍 测试表设计Connection设计数据库配置文件mysql.conf日志文件log.hppConnectionPool设计压力测试源码链接&#xff1a; 前置知…

南京大学【软件分析】13 Static Analysis for Security

文章目录 1. Information Flow Security2. Confidentiality and Integrity3. Explicit Flows and Covert/Hidden Channels4. Taint Analysis污点分析案例 1. Information Flow Security 引起安全问题最主要的两大原因是&#xff1a;injection errors&#xff08;2013-2019排名…

【深度学习实验】卷积神经网络(六):卷积神经网络模型(VGG)训练、评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&…

【网络协议】TCP

TCP协议全称为传输控制协议(Transmission Control Protocol).要理解TCP就要从他的特性开始说&#xff0c;这些特性各自之间或多或少各有联结&#xff0c;需要以宏观视角来看待。 目录&#xff1a; 1.TCP报文格式 因为报文解释过于繁琐&#xff0c;具体内容请看这篇文章TCP报文…

问题 - 谷歌浏览器 network 看不到接口请求解决方案

谷歌浏览器 -> 设置 -> 重置设置 -> 将设置还原为其默认值 查看接口情况&#xff0c;选择 All 或 Fetch/XHR&#xff0c;勾选 Has blocked cookies 即可 如果万一还不行&#xff0c;卸载浏览器重装。 参考&#xff1a;https://www.cnblogs.com/tully/p/16479528.html

微信小程序开发基础(二)基本组件

本帖开始介绍小程序中的一些基本组件~ 微信小程序是一种轻量、快速、跨平台的应用程序&#xff0c;是微信公众号的重要组成部分。随着微信小程序的普及&#xff0c;越来越多的开发者和企业开始使用微信小程序来搭建自己的应用&#xff0c;但是对于初次接触微信小程序的开发者…

CSS 基础 3

目录 &#x1f680; 导读 -- target 盒子模型 看透网页布局的本质 盒子模型组成 边框(border) border-style ​编辑border-color border-width 边框写法 简写 分开写 表格细线边框 边框会影响盒子实际大小 内边距 内容 内边距-padding padding属性简写 pad…

《PPT 自我介绍》:一本让你的职场表现更加出色的秘籍?

这里提供一个2000字左右的PPT自我介绍模板制作指南&#xff1a; 自我介绍是面试或工作中常见的情况&#xff0c;利用PPT可以给人留下更深刻的印象。但如何快速且专业地制作一个自我介绍PPT呢?这里给大家介绍几点技巧&#xff1a; 1. 选择一个简洁大方的PPT模板 首先要选择一…

STM32F4X UCOSIII任务信号量

STM32F4X UCOSIII任务信号量 任务信号量与内核信号量对比内核信号量任务信号量 UCOSIII任务信号量API任务信号量发送函数任务信号量接收函数 UCOSIII任务信号量例程 之前的章节中讲解过信号量这个机制&#xff0c;UCOSIII除了有内核信号量之外&#xff0c;还有任务信号量。在UC…

前端项目练习(练习-002-NodeJS项目初始化)

首先&#xff0c;创建一个web-002项目&#xff0c;内容和web-001一样。 下一步&#xff0c;规范一下项目结构&#xff0c;将html&#xff0c;js&#xff0c;css三个文件放到 src/view目录下面&#xff1a; 由于html引入css和js时&#xff0c;使用的是相对路径&#xff0c;所以…

详解C语言—文件操作

目录 1. 为什么使用文件 2. 什么是文件 3. 文件的使用 文件指针 文件的打开和关闭 三个标准的输入/输出流&#xff1a; 4. 文件的顺序读写 对字符操作&#xff1a; fputc&#xff1a; fgetc&#xff1a; 练习复制整个文件&#xff1a; 对字符串操作&#xff1a;…

WebGL雾化

目录 前言 如何实现雾化 线性雾化公式 雾化因子关系图 根据雾化因子计算片元颜色公式 示例程序&#xff08;Fog.js&#xff09; 代码详解​编辑 详解如何计算雾化因子&#xff08;clamp()&#xff09; 详解如何计算最终片元颜色&#xff08;根据雾化因子计算片元颜色…

搭建自己的搜索引擎之四

一、前言 搭建自己的搜索引擎之三 介绍了通过HTTP RESTful 对ES进行增删改查&#xff0c;这一般手工运维ES时使用&#xff0c;程序代码中最好还是使用Java API去操作ES会更容易维护&#xff0c;但ES API竟然贼多&#xff0c;本篇介绍一下 四种 API及其简单使用。 注&#xff…

第1篇 目标检测概述 —(2)目标检测算法介绍

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测算法是一种计算机视觉算法&#xff0c;用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法&#xff08;如Haar特征和HOG特征&#xff09;以及基于深度学习的方法&#xff0…

Docker(三)、Dockerfile探究

Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候&#xff0c;依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…