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

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

数据范围:
每组数据长度满足 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 main

import (
	"fmt"
)

func main() {
	n := 0
	fmt.Scan(&n)
	arr := make([]int, 0, n)
	tmp := 0
	for i := 0; i < n; i++ {
		fmt.Scan(&tmp)
		arr = append(arr, tmp)
	}
	result := -0x3f3f3f3f
	for 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 main

import (
	"fmt"
)

func main() {
	n := 0
	fmt.Scan(&n)
	arr := make([]int, 0, n)
	tmp := 0
	for i := 0; i < n; i++ {
		fmt.Scan(&tmp)
		arr = append(arr, tmp)
	}
	cache := make([]int, len(arr))
	result := -0x3f3f3f3f
	for 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 int
		if 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 main

import (
    "fmt"
)

func main(){
    n := 0
    fmt.Scan(&n)
    arr := make([]int,0,n)
    tmp := 0
    for 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 5

    cache := make([]int,n)
    for i := 0; i < n; i++ {
        cache[i] = 1
    }

    res := 0
    for 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
}

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

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

相关文章

C++基础入门

前言&#xff1a;哈喽小伙伴们&#xff0c;从这篇文章开始&#xff0c;博主将开启新篇章的讲解——C语言&#xff0c;那么C是一门怎么样的语言呢&#xff1f;&#xff1f;&#xff1f;它的语法又是怎么样的呢&#xff1f;&#xff1f;&#xff1f;这篇文章将给你一一解答。 目录…

阿里云部署配置幻兽帕鲁Palworld服务器教程

阿里云作为国内领先的云计算服务提供商&#xff0c;为企业和个人提供了丰富的云服务。最近幻兽帕鲁这款游戏挺火&#xff0c;阿里云为游戏开发者和玩家提供了一种高效、便捷的方式来部署配置幻兽帕鲁Palworld联机服务器&#xff0c;无需手动部署配置&#xff0c;3分钟即可完成幻…

Java笔记 --- 四、异常

四、异常 Java.lang.Throwable Error Exception&#xff08;异常&#xff09; 异常的作用 异常的处理方式 JVM默认的处理方式 捕获异常&#xff08;自己处理&#xff09; try里面没有出现异常&#xff0c;就不会运行catch里面的代码 如果出现多个异常&#xff0c;需要多个c…

【PyQt】01-PyQt下载

文章目录 前言静态库 一、PyQt是什么&#xff1f;二、安装1.Windows环境下安装安装PyQt5Designer 2.Liunx环境下安装 总结 前言 拜吾师 PyQt5 快速入门 静态库 补充一点知识&#xff1a; Windows&#xff1a; .lib Linux: .a .so(动态库) 简单描述PyQt就是python调用C的Qt文…

【超简版,代码可用!】【0基础Python爬虫入门——下载歌曲/视频】

安装第三方模块— requests 完成图片操作后输入&#xff1a;pip install requests 科普&#xff1a; get:公开数据 post:加密 &#xff0c;个人信息 进入某音乐网页&#xff0c;打开开发者工具F12 选择网络&#xff0c;再选择—>媒体——>获取URL【先完成刷新页面】 科…

2024年人工智能产业十大发展趋势

2024年人工智能产业十大发展趋势 技术变革1. 多模态预训练大模型将是人工智能产业的标配2. 高质量数据愈发稀缺将倒逼数据智能飞跃3. 智能算力无处不在的计算新范式加速实现 应用创新4. 人工智能生成内容&#xff08;AIGC&#xff09;应用向全场景渗透5. 人工智能驱动科学研究&…

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件&#xff1a;点击VSCode左侧边栏中的扩展图标&#xff08;或按 CtrlShiftX&#xff09;&a…

nodejs学习计划--(七)express框架

express框架 1. express介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs.com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB …

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

【2024-01-27可用】NVM安装太慢,镜像地址失效

安装nvm时&#xff0c; Could not retrieve https://registry.npm.taobao.org/latest/SHASUMS256.txt. 解决如下 ### 具体配置 安装路径 root: D:\Program Files\nvm path: D:\Program Files\nodejs镜像地址 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror:…

基于ncurse的floppy_bird小游戏

1. 需求分析 将运动分解为鸟的垂直运动和杆的左右运动。 2. 概要设计 2.1 鸟运动部分 2.2 杆的运动 3. 代码实现 #include <stdio.h> #include <ncurses.h>#include <stdlib.h> #include <time.h>int vx 0; int vy 1;int bird_r; int bird_c;int…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图&#xff0c;就要从“点、线、面的位置关系”这一内核开始发散&#xff0c;第一层级为彼此的位置关系&#xff0c;平行、相交、异面&#xff08;两直线间位置&#xff09;、垂直&#xff08;相交或异面中的特殊位置&#xff09;&#xff0c;多面体、旋转体等&#xff0c;然后…

【Java与网络6】实现一个自己的HTTP浏览器

前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理&#xff0c;本文我们来整个大活&#xff1a;自己实现一个简单的浏览器。 目录 1.主线程循环体 2.readHostAndPort()方法的实现 3.readHttpRequest()方法的实现 4.sendHttpRequest()方法的实现 5.readHttpRespons…

由两个有限项的等差数列B, C, 求有多少个有限项的等差数列A,满足C是A, B的所有公共项,若有无穷个A满足条件,输出-1

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back const int maxn = 1e6 + 5, inf = 1e9 + 5, maxm = 4e4 + 5, mod = 1e9 + 7, N = 1e6; // int a[maxn], b[maxn]; int n, m; string s;int qpow(int a, int b){…

Android P 屏保和休眠相关知识

Android P添加屏保功能&#xff0c;如果休眠时间设定大于屏保时间&#xff0c;则先进入屏保&#xff0c;达到休眠时间后再进入休眠 需求&#xff1a; 添加屏幕互保开关&#xff0c;默认关闭。只保留时钟&#xff0c;可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…

Microsoft Visual Studio 2022的安装与使用

1 软件介绍 Microsoft Visual Studio 2022是Microsoft Visual Studio软件的一个高版本&#xff0c;能够编写和执行C/C代码&#xff0c;具有强大的功能&#xff0c;是开发C/C程序的主流软件。 Microsoft Visual Studio 2022有三个版本&#xff0c;分别是社区版&#xff08;Commu…

ACDSee 2024旗舰版 下载安装汉化教程,ACDSee 最新版,附安装包和工具,全网最简单,轻松搞的安装,无套路

前言 ACDSee是一款数字资产管理、图片管理编辑工具软件&#xff0c;提供良好的操作界面&#xff0c;简单人性化的操作方式&#xff0c;优质的快速图形解码方式&#xff0c;支持丰富的RAW格式&#xff0c;强大的图形文件管理功能等。 准备工作 1、提前准备好 ACDSee 2024 安装…

手把手教你优雅的安装虚拟机 Ubuntu —— 图文并茂

目录 Ubuntu 获取Vmware 安装新建虚拟机Ubuntu 安装虚拟机工具安装更多内容 本文教你如何优雅的在虚拟机中安装 Ubuntu&#xff0c;图文并茂、包教包会&#xff01; Ubuntu 获取 Ubuntu 官网镜像下载速度较慢&#xff0c;建议从国内镜像网站下载&#xff0c;如网易、中科大、…

针对于vue element-plus组件的el-date-picker日期区间组件的日期格式问题以及如何进行区间判断

<template><el-date-picker v-model"value1" type"daterange" range-separator"To" start-placeholder"开始日期" end-placeholder"结束日期" :size"size" change"sarend" /> </templat…

【网站项目】基于SSM的231论文投稿系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…