一、动态规划简单实例

news2024/11/18 13:34:08

【题目】

        当我们给定一个简单序列[1、5、2、4、3],现在要求输出该序列中,最大子序列的长度,子序列要求从小到大,元素下标可以跳跃,例如子序列[1、2、3]。

【实现方式(暴力实现)】

1、先定义一个函数L(nums,i),

(1)传入参数为全部子序列和某一个元素的下标,

(2)作用是找到以该元素为首元素,最长子序列的长度,并返回这个长度

2、再定义一个函数length_of_LIS(nums),

(1)传入参数为全部序列,

(2)作用是循环调用L(nums,i)函数,依次将每个元素的下标传入,得到L(nums,i)函数的返回值,再取返回值的最大值,作为最大子序列的长度,

3、在if __name__=="__main__":中调用length_of_LIS(nums)函数,传入被查找序列,得到其最大子序列的长度,

【实现代码(暴力实现)】

"""
最长子序列
"""


def L(nums, i):
    """
    传入参数为全部序列和某一个元素的下标,
    该函数的作用是,找到以该下标元素为首元素的最长子序列
    it will return the max number from your list
    :return:Null
    """
    if i == len(nums) - 1:
        return 1
    # 初始化子系列的长度为1
    max_len = 1
    for j in range(i + 1, len(nums)):
        if nums[i] < nums[j]:
            max_len = max(max_len, L(nums, j) + 1)
    return max_len


def length_of_LIS(nums):
    """
    传入参数为全部序列,和每一个元素的下标
    调用L(nums,i)函数,得到以(每个元素为首元素的)最长子序列的长度,取其最大值,返回
    :param nums:
    :return:
    """
    return max(L(nums, i) for i in range(len(nums)))


if __name__ == '__main__':
    nums = [1, 5, 2, 4, 3]
    print(length_of_LIS(nums))

【时间time】

 可以看到,暴力算法的时间大概在0.66秒左右,

【实现方式(动态规划)】

1、初始化一个字典things,

(1)key:存储下标

(2)value:存储以key为下标的元素作为首元素,所能组成的最长子序列的长度

2、在调用L(nums,i)时,先查找things字典的key是否有i,如果有,查看以该元素为首元素,所形成的最长子序列的长度,并将其返回,这样会节省很大运行时间。

【实现代码(dp算法)】

"""
最长子序列
"""
import time

# 定义things字典,key存储序列的元素,value存储该key元素,所能组成的最长的子序列的长度
things = {}


def L(nums, i):
    """
    传入参数为全部序列和某一个元素的下标,
    该函数的作用是,找到以该下标元素为首元素的最长子序列
    it will return the max number from your list
    :return:Null
    """
    # 查询下标为i的元素,以其为首元素所组成的最长子序列的长度
    if i in things:
        return things[i]
    if i == len(nums) - 1:
        return 1
    # 初始化子系列的长度为1
    max_len = 1
    for j in range(i + 1, len(nums)):
        if nums[i] < nums[j]:
            max_len = max(max_len, L(nums, j) + 1)
    return max_len


def length_of_LIS(nums):
    """
    传入参数为全部序列,和每一个元素的下标
    调用L(nums,i)函数,得到以(每个元素为首元素的)最长子序列的长度,取其最大值,返回
    :param nums:
    :return:
    """
    return max(L(nums, i) for i in range(len(nums)))


if __name__ == '__main__':
    start_time = time.time()
    nums = [1, 5, 2, 4, 3]
    print(length_of_LIS(nums))
    end_time = time.time()
    print(f"运行时间为{end_time - start_time}")

【时间time】

在使用了dp算法之后,时间大致在0.35秒左右

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

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

相关文章

C# 给某个方法设定执行超时时间

C# 给某个方法设定执行超时时间在某些情况下(例如通过网络访问数据)&#xff0c;常常不希望程序卡住而占用太多时间以至于造成界面假死。 在这时、我们可以通过Thread、Thread Invoke&#xff08;UI&#xff09;或者是 delegate.BeginInvoke 来避免界面假死&#xff0c; 但是…

RocketMQ 基于时间轮算法实现指定时间点的定时消息原理解析

在 RocketMQ 4.x 版本&#xff0c;使用延时消息来实现消息的定时消费。延时消息可以一定程度上实现定时发送&#xff0c;但是有一些局限。 RocketMQ 新版本基于时间轮算法引入了定时消息&#xff0c;目前&#xff0c;精确到秒级的定时消息实现的 pr 已经提交到社区&#xff0c…

unity中绑定动画的行为系统

主要代码逻辑是创建一个action队列,当动画播放结束时就移除队头,执行后面的事件 public class Enemy : MonoBehaviour {public event Action E_AnimatorFin;//当动画播放完毕时public Action DefaultAction;//默认事件public Dictionary<Action, string> EventAnimator n…

数据科学最佳实践:Kedro 的工程化解决方案 | 开源日报 No.47

leonardomso/33-js-concepts Stars: 58.4k License: MIT 这个项目是一个帮助开发者掌握 JavaScript 概念的资源库。该项目基于 Stephen Curtis 撰写的一篇文章&#xff0c;包含了对 33 个重要 JavaScript 概念全面深入地讲解&#xff0c;并被 GitHub 评为 2018 年最佳开源项目…

Python Random模块详解

Random模块详解 随机数 random模块 randint(a, b) 返回[a, b]之间的整数randrange ([start,] stop [,step]) 从指定范围内&#xff0c;按指定基数递增的集合中获取一个随机数&#xff0c;基数 缺省值为1。random.randrange(1,7,2)choice(seq) 从非空序列的元素中随机挑选一个…

驱动器类产品的接口EMC拓扑方案

驱动器类产品的接口EMC拓扑方案 1. 概述 本文以高压伺服驱动器和变频器类产品为例&#xff0c;对常用端口滤波拓扑方案进行总结&#xff0c;后续根据不同的应用场景可进行适当删减&#xff0c;希望对大家有帮助。 2. 驱动器验证等级 本文推荐拓扑的实验结果&#xff0c;满足…

Ps:选择并遮住

选择并遮住 Select and Mask主要用来提高选区边缘的品质&#xff0c;尤其在毛发等复杂边缘的抠图上发挥强大的作用。 Ps菜单&#xff1a;选择/选择并遮住 Select and Mask 快捷键&#xff1a;Ctrl Alt R 在所有选区工具的工具选项栏上以及图层蒙版的属性面板中都可以看到“选…

NAT+ACL+mstp小综合

三、实验一相关知识点 1&#xff0c;实验&#xff1a;NAT 综合实验 2&#xff0c;拓扑&#xff1a; 3&#xff0c;需求: 1&#xff09;&#xff0c;实现VLAN20 的除了20这台主机以外所有主机上网访问外网 2&#xff09;&#xff0c;实现VLAN30 的主机为奇数电脑上网 3&#…

详解C语言—预处理

目录 1、预处理 (1)预定义符号介绍 (2)预处理指令 #define #define 定义标识符&#xff1a; #define 定义宏&#xff1a; #define 替换规则 (3)预处理操作符# (4)预处理操作符## (5)带副作用的宏参数 (6)宏和函数对比 2、命名约定 3、预处理指令 #undef 4、命令行定…

用 Pytorch 自己构建一个Transformer

一、说明 用pytorch自己构建一个transformer并不是难事,本篇使用pytorch随机生成五千个32位数的词向量做为源语言词表,再生成五千个32位数的词向量做为目标语言词表,让它们模拟翻译过程,transformer全部用pytorch实现,具备一定实战意义。 二、论文和概要 …

mac连接easyconnnect显示“本地环境出现异常”

mac连接easyconnnect显示“本地环境出现异常” 解决方法&#xff1a; 终端下输入&#xff1a;vim ~/.zprofile文件内加入如下内容&#xff0c;如下图&#xff1a; ####解决连接easyconnnect显示“本地环境出现异常问题 function EC_start(){/Applications/EasyConnect.app/Co…

学信息系统项目管理师第4版系列19_质量管理

1. 公差 1.1. 质量测量中公差是测量指标的可允许变动范围&#xff0c;而不是实际测量值与预期值的差 1.1.1. 【高22下选35】 1.2. 结果的的可接受范围 2. 控制界限 2.1. 统计意义上稳定的过程或过程绩效的普通偏差的边界 3. 3版 3.1. 质量控制新七工具 3.1.1. 【高19下…

cpp primer笔记070-算法函数

accumulate的第三个参数的类型决定了函数中使用哪个加法运算符以及返回值的类型&#xff0c;如果返回值是自定义类型&#xff0c;需要使用accumlate&#xff0c;则需要重载运算符&#xff0c;该接口的第三个参数返回的是一个需要处理的数据类型的一个变量。 std::vector<std…

蓝桥等考Python组别十四级001

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 501, B: 602, C: 703, D: 804} print(d[B]) 501602703804 正确答案&#xff1a;B 2、Python L14 &#xff08;15分…

吃鸡高手必备工具大揭秘!提高战斗力,分享干货,一站满足!

大家好&#xff01;你是否想提高吃鸡游戏的战斗力&#xff0c;分享顶级的游戏作战干货&#xff0c;方便进行吃鸡作图和查询装备皮肤库存&#xff1f;是否也担心被骗&#xff0c;希望查询游戏账号是否在黑名单上&#xff0c;或者查询失信人和VAC封禁情况&#xff1f;在这段视频中…

System Generator学习——使用 AXI 接口和 IP 集成器

文章目录 前言一、目标二、步骤1、检查 AXI 接口2、使用 System Generator IP 创建一个 Vivado 项目3、创建 IP 集成设计&#xff08;IPI&#xff09;4、实现设计 总结 前言 在本节中&#xff0c;将学习如何使用 System Generator 实现 AXI 接口。将以 IP 目录格式保存设计&am…

「专题速递」回声消除算法、低功耗音频、座舱音频系统、智能音频技术、低延时音效算法、手机外放增强算法...

随着多媒体和通信网络技术的持续升级&#xff0c;以及新型音视频应用场景的不断涌现&#xff0c;音频处理技术正朝着更加智能化和沉浸化的方向迅猛发展。人们对音频听觉体验的要求也逐渐提高&#xff0c;无论是在何种场景下&#xff0c;都期望获得更加清晰的声音&#xff0c;并…

吃鸡高手必备!这些技巧帮你提高战斗力!

大家好&#xff01;作为一名吃鸡玩家&#xff0c;我们都想提高自己的战斗力&#xff0c;享受顶级游戏作战干货&#xff0c;装备皮肤库存展示和查询&#xff0c;并避免被骗游戏账号。在这里&#xff0c;我将为大家介绍一些实用的技巧和工具&#xff0c;让你成为吃鸡高手&#xf…

三相逆变器下垂控制双机

下垂控制的原理推荐看这篇知乎&#xff08;形象又生动&#xff09;&#xff1a;https://www.zhihu.com/question/41003509/answer/518837491 主拓扑图 控制主要模块 Droop子模块 监控有功结果 1、从两台逆变器输出的有功功率波形可以看到&#xff0c;在负载突变的时候&#xf…

卷积网络的发展历史-AlexNet

简介 2012 年&#xff0c;Krizhevsky 与 Hinton 推出了 AlexNet&#xff0c;引起了许多学者对深度学习的研究&#xff0c;可以算是深度学习的热潮的起始标志。在图像分类领域不得不提的就是ImageNet大规模视觉挑战赛(ILSVRC)&#xff0c;它被称为深度学习在图像分类任务研究方…