数据结构算法刷题(29)动态规划

news2024/11/21 2:30:06

 思路一:回溯:按照选和不选的判断方式,使用回溯来解决这个问题。

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums) #数组的长度

        def dfs(i):

            if i<0: #到达边界条件后

                return 0 #返回最大金额是0

            res = max(dfs(i-1),dfs(i-2)+nums[i]) #如果选,下一次递归的就是i-2,并且要加上nums[i]的值,如果不选,下一次递归i-1。比较选或者不选的最大值并返回。

            return res

        res = dfs(n-1) #传入的是数组的最大下标

        return res

问题:回溯使用递归,时间复杂度是指数级别的,会超时,那如何让时间降下来?

思路二:有两次相同的计算结果,那就把每个位置的计算结果保存下来,可以把时间缩短。

 

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        cache = [-1]*n #因为每个位置一定不是负数

        def dfs(i):

            if i<0:

                return 0

            if cache[i] != -1: #当前的位置不是-1,那么这个位置被计算过,直接返回计算的结果

                return cache[i] 

            res = max(dfs(i-1),dfs(i-2)+nums[i])

            cache[i] = res #把当前位置的计算结果保存

            return res

        res = dfs(n-1)

        return res

问题:这种方式的空间复杂度就是O(n),如何将空间复杂度降下来:递推

思路三:我们可以确定的知道每个节点是那几个数归的结果,那把递的过程省略,直接归,也就是从下往上计算结果。

 

 循环对数组下标有要求,所以下标从2开始。

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        f = [0]*(n+2) #归的数组长度是n+2,每个数组的值是0

        for i,x in enumerate(nums): #遍历nums

            f[i+2] = max(f[i+1],f[i]+x) # 等同于res = max(dfs(i-1),dfs(i-2)+nums[i])

        return f[n+1]

改进空间复杂度:

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        f0 = f1 = 0

        for i,x in enumerate(nums):

            new_f = max(f1,f0+x)

            f0 = f1

            f1 = new_f

        return f1

思路:

class Solution:

    def climbStairs(self, n: int) -> int:

        dp0 = 1

        dp1 = 1

        if n <= 1:

            return 1

        dp = 0

        for i in range(2,n+1):

            dp = dp0 + dp1

            dp0 = dp1

            dp1 = dp

        return dp

 思路:

 

class Solution:

    def minCostClimbingStairs(self, cost: List[int]) -> int:

        n = len(cost)

        dp0 = 0 #第0级台阶的顶部最小花费是0

        dp1 = min(cost[0],cost[1]) #第1级台阶的顶部台阶的最小花费是cost[0]或cost[1]的最小值

        for i in range(2,n):

            dp = min(dp1+cost[i],dp0+cost[i-1])

            dp0 = dp1

            dp1 = dp

        return dp1

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

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

相关文章

医疗环境升级改造,从此温湿度监控不用慌!

在现代医疗环境中&#xff0c;为了确保患者的舒适和康复&#xff0c;温度和湿度的监控和管理变得至关重要。特别是在疗养院这样的医疗机构中&#xff0c;患者的健康与室内环境条件密切相关。温度和湿度的不适当波动可能导致不仅是不适&#xff0c;还可能加剧病情&#xff0c;影…

9月8日上课内容 第一章 rsync远程同步

主从复制总结 redis主从复制 是为了数据冗余和读写分离 在这两种模式中&#xff0c;有两种角色主节点 (master) 和从节点 (slave) &#xff0c;主节点负责处理写的操作&#xff0c;并将数据更改复制到一个或多个从节点。这样我们的主节点负载减轻&#xff0c;从节点可以提供数据…

UI设计新手指南之什么是UI设计?

最直观的&#xff0c;只要用手机&#xff0c;打开界面就会接触到 UI 设计。 UI 设计是什么&#xff1f;它是指对软件人机交互、操作逻辑、界面美观的整体设计。UI设计的目的是创造出简单、直观、易于使用的界面&#xff0c;为用户提供良好的体验。随着移动互联网的兴起&#x…

分享一下奶茶店怎么在小程序上做商城功能

随着移动互联网的普及&#xff0c;越来越多的消费者倾向于在手机上完成购物需求。对于奶茶店来说&#xff0c;在小程序上开设商城功能不仅可以扩大销售渠道&#xff0c;还能提高品牌知名度和用户体验。本文将探讨如何在小程序上为奶茶店实现商城功能。 对于奶茶店的商城功能&am…

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

旅游复苏弹高OTA业绩,未来走势却有“U型曲线”与“抛物线”之变

文 | 螳螂观察 作者 | 易不二 经历了3年蛰伏&#xff0c;旅游业确实熬出头了&#xff0c;OTA也迎来了强势反弹。 自年初起就逐步恢复的旅游行业&#xff0c;经历了暑期小高潮后&#xff0c;正在逐步以强劲的复苏能力&#xff0c;为OTA们的期中财报增彩。 今年二季度&#x…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …

机器学习_个人笔记_周志华(更新中......)

第1章 绪论 1.1 引言 形成优秀的心理表征&#xff0c;自然能成为领域内的专家。 系统1 & 系统2。 机器学习&#xff1a;致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。主要研究计算机从数据中产生model的算法&#xff0c;即“learning algori…

myCobot Pro600六轴机械臂与3D深度视觉:物体精确识别抓取堆叠

Introduction 随着时代的进步&#xff0c;各种精密的机械臂&#xff0c;人形机器人不断的问世。我们即将迎来到处都是机器人的高科技时代。为了跟上时代的脚步&#xff0c;我最近入手了一台myCobot pro 600机械臂&#xff0c;我主要是想要用它来学习机械臂相关得控制以及机器视…

【跟小嘉学 Apache Flink】二、Flink 快速上手

系列文章目录 【跟小嘉学 Apache Flink】一、Apache Flink 介绍 【跟小嘉学 Apache Flink】二、Flink 快速上手 文章目录 系列文章目录[TOC](文章目录) 一、创建工程1.1、创建 Maven 工程1.2、log4j 配置 二、批处理单词统计&#xff08;DataSet API&#xff09;2.1、创建 Bat…

今日话题:解决Linux中可以识别但无法连接Airpods问题(亲测且实用)

今日话题&#xff1a;解决Linux中可以识别但无法连接Airpods问题 起因经过结果方式一方式二 起因经过 在根据“Linux启动黑屏卡住Logo登录界面无法进入系统的终极解决方式”博客解决掉gdm3以及lightdm图形界面之间冲突的问题后&#xff0c;准备设置打开蓝牙连接Airpods&#x…

Java | 多线程

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;前言&#x1f334;一、什么是多线程&#xff1f;1.进程2.线程3.多线程作用 &#x1f334;二、多线程中的两个概念1. 并发2. 并行3.举例…

python-面向运行时性能优化-threading

python-面向运行时性能优化-threading 一:线程基础1> 线程状态2> 线程同步1. 锁的状态3> 线程通信-条件变量4> 线程阻塞-之间转换1. 阻塞分类二:threading类1> threading介绍2> Thread类1. Thread的生命周期2. 实例化Thread类3. 继承Thread类4. Thread构造…

9.11作业

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 sum0 arr(11 22 33 44 55) Sum() {for i in ${arr[*]}do$((sumi))donereturn $sum } Sum ${arr[*]} var$? echo $var写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 Sum() {aid -…

C高级作业 【使用shell脚本】 实现一个对数组求和的函数,数组通过实参传递给函数+写一个函数输出当前用户的uid和gid,并使用变量接收结果

作业 1、实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bash # 定义求和函数 function sum() {local arr("$") # 将传入的参数保存到一个数组中local sum0 # 初始化求和为0# 遍历数组元素进行求和for num in "${arr[]}";dosum$…

零代码编程:用ChatGPT批量合并ts文件

文件夹中有很多个ts后缀的视频文件&#xff0c;要合并成一个视频文件&#xff0c;在ChatGPT中可以这样输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量合并ts文件的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;C:\Users\dell\…

亚马逊测评下单怎么操作?有没有自动下单软件?

想要进行亚马逊的测评下单&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;在亚马逊官方网站上搜索你感兴趣的产品&#xff0c;选择你喜欢的产品并查看其详细信息、价格以及其他用户的评价&#xff0c;确认你的购买意向后&#xff0c;点击“加入购物车”将…

C高级 shell指令分支和循环

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bash s0 function sum() {local brr($*)for i in ${brr[*]}do((si))doneecho $s } arr(1 2 3 4 5 6 7 8 9 ) sum ${arr[*]}写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 #…

Grafana配置邮件告警

1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…

DAY03_瑞吉外卖——公共字段自动填充新增分类分类信息分页查询删除分类修改分类

目录 1. 公共字段自动填充1.1 问题分析1.2 基本功能实现1.2.1 思路分析1.2.2 代码实现1.2.3 功能测试 1.3 功能完善1.3.1 思路分析1.3.2 ThreadLocal1.3.3 操作步骤1.3.4 代码实现1.3.5 功能测试 2. 新增分类2.1 需求分析2.2 数据模型2.3 前端页面分析2.4 代码实现2.5 功能测试…