最长上升子序列的动态规划:暴力dfs + 记忆化搜索 + dp

 LIS ,(Longest Increasing Subsequence)本题链接:895. 最长上升子序列 - AcWing题库

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

目录

方法一:暴力dfs

 方法二:记忆化搜索

方法三:dp


   本篇将直接给出代码,具体讲解请移步以下博客:动态规划入门:从暴力dfs到dp-CSDN博客

从01背包开始动态规划:暴力解法 + dp + 滚动数组 + dp优化-CSDN博客

方法一:暴力dfs

  1. 找到最后一步:以当前数作为子序列的结尾,因此 f [ i ] 的含义为第 i 个数作为子序列结尾,最长的上升子序列长度为多少
  2. 递归选择:当以第i个数作为结尾时,遍历其前面所有的数,而对于前面每一个数,都有选和不选两种情况,因为在dfs中尽可能减少参数,因此当选择当前数时,通过return + 1的方式来表示当前数的子序列个数 + 1
#include<iostream>
#include<cmath>
using namespace std;int n;
const int N = 1010;
int nums[N];int dfs(int index){int res = 0;for(int i = 0;i < index;i++){if(nums[i] < nums[index]) res = max(res,dfs(i) + 1);}return res;
}int main(){cin >> n;for(int i = 0;i < n;i++) cin >> nums[i];int res = -1e9;//将每一个数作为结尾for(int i = 0;i < n;i++){res = max(res,dfs(i));}cout << res + 1;return 0;
}

 方法二:记忆化搜索

  增加一个mem数组用于存储

#include<iostream>
#include<cmath>
using namespace std;int n;
const int N = 1010;
int nums[N];
int mem[N];int dfs(int index){if(mem[index]) return mem[index];int res = 0;for(int i = 0;i < index;i++){if(nums[i] < nums[index]) res = max(res,dfs(i) + 1);}mem[index] = res;return res;
}int f[N];int main(){cin >> n;for(int i = 0;i < n;i++) cin >> nums[i];int res = -1e9;//将每一个数作为结尾for(int i = 0;i < n;i++){res = max(res,dfs(i));}cout << res + 1;return 0;
}

方法三:dp

dp思路为:枚举每一个数作为子序列结尾,在枚举其倒数第二个数

#include<iostream>
#include<cmath>
using namespace std;int n;
const int N = 1010;
int nums[N];
int mem[N];int f[N];int main(){cin >> n;for(int i = 0;i < n;i++) cin >> nums[i];int res = -1e9;//将每一个数作为结尾for(int i = 0;i < n;i++){f[i] = 0;for(int j = 0;j < i;j++){if(nums[j] < nums[i])f[i] = max(f[i],f[j] + 1);}res = max(res,f[i]);}cout << res + 1;return 0;
}

以上是本文全部内容,如果对你有帮助点个赞再走吧~  ₍˄·͈༝·͈˄*₎◞ ̑̑

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

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

相关文章

华为OD机22道试题

华为OD机试题 2.查找小朋友的好朋友位置 在学校中&#xff0c;N 个小朋友站成一队&#xff0c;第 i 个小朋友的身高为 height[i]&#xff0c;第 i 个小朋友可以看到第一个比自己身高更高的小朋友j&#xff0c;那么 j 是 i 的好朋友 (要求&#xff1a;j>i) 。 请重新生成一个…

202305 CSP认证

202305-1 重复局面 第一题直接干 #include<bits/stdc.h> using namespace std; unordered_map<string, int> chess; int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);string line, str ""; int n;cin >> n;while(n --){str …

数据结构:链式队列

1.设计思想&#xff1a; 我们可以设计出以上五种队列&#xff0c;但是基于时间复杂度&#xff0c;和空间复杂度的最优解&#xff0c;我们选择入队和出队均为O(1)的&#xff0c;也就是第五种 2.结构设计 typedef struct LPNode//数据节点 {int data;//数据struct LPNode* next…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的捕获模式(外部中断)应用

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的捕获模式(外部中断)应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 805…

【leetcode】动态规划专题

70.爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示…

【Langchain-Chatchat】部署ChatGLM3-6B-32K教程

介绍 Langchain-Chatchat这个框架可以帮助我们更容易的部署大语言模型&#xff0c;之前也写过ChatGLM传统的部署教程&#xff0c;有兴趣的可以参考 【ChatGLM3】第三代大语言模型多GPU部署指南【ChatGLM2-6B】从0到1部署GPU版本 借助Langchain-Chatchat框架&#xff0c;可以…

什么是递归函数?列出一个递归函数的例子

一、什么是递归函数&#xff1f;列出一个递归函数的例子 递归函数是一种直接或间接调用自身的函数。在函数体内部&#xff0c;递归函数会调用自身来处理更小的数据子集&#xff0c;直到达到一个基准情况&#xff08;base case&#xff09;&#xff0c;此时函数将停止递归并返回…

32串口学习

基于之前的GPIO等工程&#xff0c;后面的上手难度就简单多了&#xff0c;主要是相关寄存器的设置。 void USART1_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph…

计算机网络:信道复用技术概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

14个前端常见算法(5颗星)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1:…

数据结构从入门到精通——希尔排序

希尔排序 前言一、希尔排序( 缩小增量排序 )二、希尔排序的特性总结三、希尔排序动画演示四、希尔排序具体代码实现test.c 前言 希尔排序是一种基于插入排序的算法&#xff0c;通过比较相距一定间隔的元素来工作&#xff0c;各趟比较所用的距离随着算法的进行而减小&#xff0…

【前端】Web API

1.Web API 简介 JS分为三大部分&#xff1a; ESCMScript&#xff1a;基础语法部分DOM API&#xff1a;操作页面结构BOM API&#xff1a;操作浏览器 Web API包含 DOM BOM 2.DOM基本概念 DOM全称 Document Object Mod…

最短路算法

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 目录 朴素dijkstra算法 堆优化版dijkstra算法 Bellman-Ford算法 spfa 算法&#xff08;队列优化的Bellman-Ford算法&#xff09; spfa判断图中是否存在负环 floyd算法 朴素dijkstra算法 思路&#xff1a; 集合…

React简介

React简介 开发网页&#xff1a;引入react和react-native库。 开发手机端应用&#xff1a;引入react和react-dom库。 特点&#xff1a; 虚拟Dom&#xff08;开发者》react》虚拟Dom》Dom&#xff09;&#xff1b; 声明式&#xff08;结果为导向的编程&#xff0c;自动生成代码…

Linux相关命令(2)

1、W &#xff1a;主要是查看当前登录的用户 在上面这个截图里面呢&#xff0c; 第一列 user &#xff0c;代表登录的用户&#xff0c; 第二列&#xff0c; tty 代表用户登录的终端号&#xff0c;因为在 linux 中并不是只有一个终端的&#xff0c; pts/2 代表是图形界面的第…

长三角科技盛会“2024南京国际人工智能,机器人,自动驾驶展览会”

2024南京国际人工智能,机器人,自动驾驶展览会 2024 Nanjing International Ai, Robotics, Autonomous Driving Expo 时间:2024年11月22-24日 地点:南京国际博览中心 南京&#xff0c;这座历史悠久的文化名城&#xff0c;如今正站在新一轮科技产业变革的前沿&#xff0c;以人工…

uni app 空挡接龙

pc游戏 空挡接龙 还不完整。现在没时间搞了记录在这里&#xff0c;等以后有时间了再继续搞。 <template><view class"page_main"><view class"contentone"><canvas class"canvas_cla" style"z-index: 1;" canva…

【C++】每日一题 452 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

院子摄像头的监控

院子摄像头的监控和禁止区域入侵检测相比&#xff0c;多了2个功能&#xff1a;1&#xff09;如果检测到有人入侵&#xff0c;则把截图保存起来&#xff0c;2&#xff09;如果检测到有人入侵&#xff0c;则向数据库插入一条事件数据。 打开checkingfence.py&#xff0c;添加如下…