上升子序列的最大长度,递归-记忆化搜索-动态规划三步走

题目描述:
小明有一个数组,他想从数组任意元素开始向后遍历,找出所有上升子序列,并计算出最长的上升子序列的长度。

数据范围:
每组数据长度满足 1≤n≤200 1≤n≤200 , 数据大小满足 1≤val≤350 1≤val≤350

输入描述:
数据共2行,第1行先输入数组的个数,第2行再输入梅花桩的高度

输出描述:
输出一个结果

示例:
假设数组为:6,2,3,7,9,0,10
若选择第一个元素6作为起点,则最长的上升子序列为:6,7,9,10;长度为4
若选择第二个元素2作为起点,则最长的上升子序列为:2,3,7,9,10;长度为5
若选择第三个元素3作为起点,则最长的上升子序列为:3,7,9,10;长度为4
若选择第四个元素7作为起点,则最长的上升子序列为:7,9,10;长度为3
若选择第五个元素9作为起点,则最长的上升子序列为:9,10;长度为2
若选择第六个元素0作为起点,则最长的上升子序列为:0,10;长度为2
若选择第七个元素10作为起点,则最长的上升子序列为:10;长度为1

用一个矩阵表示上述示例信息:
6,2,3,7,9,0,10
6,x,x,79,x,10
x,2379,x,10
x,x,379,x,10
x,x,x,79,x,10
x,x,x,x,9,x,10
x,x,x,x,x,010
x,x,x,x,x,x,10
x,x,x,x,x,x,x

站在每一个元素的位置考虑,若当前位置的元素比其前边的元素要大,则形成了一种升序的关系。
如:
站在元素6的位置考虑,它前边没有元素,所以它本身就构成了一个上升子序列。
站在元素2的位置考虑,它前边有一个元素,但是前边的元素6比它本身要大,所以它也只能用元素本身构成一个升序子序列。
站在元素3的位置考虑,元素6肯定无法与元素3构成升序的关系,但是元素2可以。所以站在元素3的位置考虑,升序子序列为2,3。以此类推。
我们考虑一个位置的元素是否与之前的元素构成升序关系,那么直接从下标0遍历到当前元素位置-1的位置,用当前位置元素与过往元素逐一比较就能辨别出是否含有升序关系。如下图,可以明显的发现,考虑第n个位置的元素是否与0~n-1位置的元素构成升序子序列时,有多个重复的子过程。
即考虑6的时候,前方无元素
考虑2的时候,要考虑前方的6
考虑3的时候,要考虑前方的6和2…
在这里插入图片描述那么现在使用递归设计一套流程,计算以每个位置为结尾的子数组包含多少个上升子序列的元素,并取最大的元素个数。

package mainimport ("fmt"
)func main() {n := 0fmt.Scan(&n)arr := make([]int, 0, n)tmp := 0for i := 0; i < n; i++ {fmt.Scan(&tmp)arr = append(arr, tmp)}result := -0x3f3f3f3ffor i := 0; i < len(arr); i++ {tmp := process(arr, i)if tmp > result {result = tmp}}fmt.Println(result)
}func process(arr []int, index int) (result int) {if index == 0 {return 1}for i := 0; i < index; i++ {if arr[index] > arr[i] {tmp := process(arr, i)if tmp > result {result = tmp}}}return result + 1
}

因为有多个重复子过程,所以可将上述流程优化成记忆化搜索。

package mainimport ("fmt"
)func main() {n := 0fmt.Scan(&n)arr := make([]int, 0, n)tmp := 0for i := 0; i < n; i++ {fmt.Scan(&tmp)arr = append(arr, tmp)}cache := make([]int, len(arr))result := -0x3f3f3f3ffor i := 0; i < len(arr); i++ {tmp := process(arr, cache, i)if tmp > result {result = tmp}}fmt.Println(result)
}func process(arr []int, cache []int, index int) (result int) {if index == 0 {return 1}for i := 0; i < index; i++ {var tmp intif arr[index] > arr[i] {if cache[i] != 0 {tmp = cache[i]} else {tmp = process(arr, cache, i)cache[i] = tmp}if tmp > result {result = tmp}}}return result + 1
}

有了记忆化搜索,我们何不将其优化成动态规划的形式,将递归换成循环即可。如下:记忆化搜索改写成动态规划。

package mainimport ("fmt"
)func main(){n := 0fmt.Scan(&n)arr := make([]int,0,n)tmp := 0for i := 0; i < n; i++ {fmt.Scan(&tmp)arr = append(arr, tmp)}// 6// 2 5 1 5 4 5 // 2 x x x 4 5// x 5 x x x x// x x 1 x 4 5// x x x 5 x x// x x x x 4 5// x x x x x 5cache := make([]int,n)for i := 0; i < n; i++ {cache[i] = 1}res := 0for i := 1; i < n; i++ {for j := 0; j < i; j++ {if arr[i] > arr[j] {cache[i] = max(cache[i], cache[j]+1)}}if cache[i] > res {res = cache[i]}}fmt.Println(res)}func max(a, b int) int {if a > b {return a}return b
}

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

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

相关文章

牛客BC151 数位五五

今天有点懒&#xff0c;就是一篇水文吧。 第一种方法用循环的方式来解决。 int main() {int a, b, count 0;scanf("%d %d", &a, &b);for (int i a; i < b; i) {int val i, sum 0;while (val) {sum val % 10;val / 10;}if (sum % 5 0) count;}pri…

从零学习Hession RPC

为什么学习Hessian RPC&#xff1f; 存粹的RPC&#xff0c;只解决PRC的四个核心问题&#xff08;1.网络通信2.协议 3.序列化 4.代理&#xff09;Java写的HessianRPC落伍了&#xff0c;但是它的序列化方式还保存着&#xff0c;被Dubbo(Hessian Lite)使用。 被落伍&#xff0c;只…

缓存技术—redis

一、redis介绍 1.什么是NoSQL NosQL (Not-Only:sQL)&#xff0c;泛指非关系型的数据库(关系型数据库: 以二维表形式存储数据) 非关系型的数据库现在成了一个极其热门的新领域&#xff0c;发展非常迅速。而传统的关系数据库在应付超大规模和高并发的网站已经显得力不从…

Django笔记(六):DRF框架

首 前后端分离是互联网应用开发的标准使用方式&#xff0c;让前后端通过接口实现解耦&#xff0c;能够更好的进行开发和维护。 RESTful接口常见规范 在接口设计中&#xff0c;大家遵循一定的规范可以减少很多不必要的麻烦&#xff0c;例如url应有一定辨识度&#xff0c;可以…

精品代码,接稳了!EI顶刊复现:计及风电波动及电解槽运行特性的电氢混合储能容量优化配置程序代码!

适用平台/参考文献&#xff1a;MatlabYalmipCplex/Gurobi&#xff1b; 参考文献&#xff1a;中国电机工程学报首发论文《平抑风电波动的电-氢混合储能容量优化配置》 程序首先利用EMD将原始风电功率信号分解为直接并网分量和混合储能系统&#xff08;HESS&#xff09;功率任务…

算法训练营Day60(单调栈)

84.柱状图的最大矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 注意首尾加0的细节就可 class Solution {public int largestRectangleArea(int[] heights) {Deque<Integer> stack new LinkedList<>();int[] newHeight new int[heights.…

Windows上安装Linux系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、WSL是什么&#xff1f;二、WSL安装步骤1.开启wsl支持2.安装wsl3.运行wsl4.环境配置 三、WSL删除引用 前言 提示&#xff1a;这里可以添加本文要记录的大概…

Dockerfile简介和基础实践

文章目录 1、Dockerfile简介1.1、Dockerfile解决的问题1.2、docker build 构建流程1.3、关键字介绍 2、Dockerfile 实践2.1、基本语法实践 --- golang2.1.1 问题检查 2.2、基本语法实践 --- gcc 总结 1、Dockerfile简介 Dockerfile是一个创建镜像所有命令的文本文件, 包含了一…

STM32 PWM驱动设计

单片机学习&#xff01; 目录 文章目录 前言 一、PWM驱动配置步骤 二、代码示例及注意事项 2.1 RCC开启时钟 2.2 配置时基单元 2.3 配置输出比较单元 2.4 配置GPIO 2.5 运行控制 三、PWM周期和占空比计算 总结 前言 PWM本质是利用面积等效原理来改变波形的有效值。 一、PWM驱动…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

SPA单页面的讲解(超级详细)

目录 一、什么是SPA 二、SPA和MPA的区别 单页应用与多页应用的区别 单页应用优缺点 三、实现一个SPA 原理 实现 hash 模式 history模式 四、题外话&#xff1a;如何给SPA做SEO SSR服务端渲染 静态化 使用Phantomjs针对爬虫处理 一、什么是SPA SPA&#xff08;sin…

这是一片测试文章

这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 真的是测试文章 -111122225555444433333333222211111 dddddaaa

❤css实用

❤ css实用 CSS渐变色边框&#xff08;Gradient borders方法的汇总 5种-代码可直接下载&#xff09; 资源链接 https://download.csdn.net/download/weixin_43615570/88779950?spm1001.2014.3001.5503 给 border 设置渐变色是很常见的效果&#xff0c;实现这个效果有很多思路…

近20k stars,GSYVideoPlayer一款优秀的视频播放器

近20k stars&#xff0c;GSYVideoPlayer一款优秀的视频播放器 引言 在现代社会中&#xff0c;视频已经成为人们获取信息和娱乐的重要形式。为了提供更好的观看体验&#xff0c;开发一款优秀的视频播放器变得至关重要。而GSYVideoPlayer作为一款功能强大、稳定可靠的视频播放器…

没指定spring-boot-maven-plugin版本导致编译失败,这坑你踩过没

文章目录 1. 前言2. 组件版本信息3. 事件经过3.1 本地通过maven命令打包3.2 定位问题步骤3.2.1 核对spring-boot-maven-plugin版本信息3.2.2 spring-boot-maven-plugin版本错误原因 3.3 解决方案 4.结论 1. 前言 我们在平时开发过程中关注的比较多的是项目开发时依赖包的版本以…

数据结构(绪论+算法的基本概念)

文章目录 一、绪论1.1、数据结构的基本概念1.2、数据结构三要素1.2.1、逻辑结构1.2.2、数据的运算1.2.3、物理结构&#xff08;存储结构&#xff09;1.2.4、数据类型和抽象数据类型 二、算法的基本概念2.1、算法的特性2.2、“好”算法的特质2.2.1、算法时间复杂度2.2.2、算法空…

java数学计算工具类 double精确的加法算法 double精确的减法算法

java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算&#xff0c;当发生除不尽的 保留小数、数值精度 精确的加法算法:2.27 精确的减法算法:0.01 精确的乘法算法:1.2882 相对精确的除法运算&#xff0c;当发生除不尽的情况时&…

领域驱动设计(Domain-Driven Design DDD)——通过重构找到深层次模型1

一、概述 重构就是在不改变软件功能的前提下重新设计它。开发人员无需在着手开发之前做出详细的设计决策&#xff0c;只需要在开发过程中不断小幅调整设计即可&#xff0c;这不但能够保证软件原有的功能不变&#xff0c;还可使整个设计更加灵活易懂。 我们面临的真正挑战是找到…

java使用MD5加密

java使用MD5加密 源字符串&#xff1a;三四五 使用 UTF-8字符集字符集加密后的结果为:f2615f1dab4520fc1e1a79ed6a4f7b37 用 GB2312 字符集加密后的结果为:1dbb006b41466197c486592727af516f 用 GBK 字符集加密后的结果为:1dbb006b41466197c486592727af516f

TCP 状态转换以及半关闭

TCP 状态转换&#xff1a; 上图中还没有进行握手的时候状态是关闭的。 三次握手状态的改变&#xff1a; 客户端发起握手。 调用 connect() 函数时状态转化为&#xff1a;SYN_SENT。调用 listen() 函数时状态转换为&#xff1a;LISTEN。ESTABLISHED是被连接的状态。 四次挥手…