当前位置: 首页 > news >正文

动态规划入门题目

动态规划(记忆化搜索):

将给定问题划分成若干子问题,直到子问题可以被直接解决。然后把子问题的答保存下来以免重复计算,然后根据子问题反推出原问题解的方法

动态规划也称为递推(暴力深搜+记忆中间状态结果)其中:

  • 递推公式 = dfs向下递归的公式
  • 递推列表的初始值 = 递归的边界

文章目录

  • 一、爬楼梯
    • 思路
    • 解题方法
    • 复杂度
    • 复杂度
  • 二、三角形最小路径和
    • 思路
    • 思路
    • 解题方法
    • 复杂度
      • 复杂度
  • 三、大盗阿福
    • 思路
    • 解题方法
    • 复杂度

一、爬楼梯

Problem One: 70. 爬楼梯

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

输入:

输入一个整数表示台阶数 n

输出:

返回一个整数,表示爬到楼顶的方案数。

思路

  • 对第一级台阶,方案数等于1,对第二级台阶,方案数为2(直接迈两级或迈两次一级)
  • 对于第i级台阶(i >= 3)来说,它的前驱台阶可能是i-1,也可能是i-2,所以从第0阶台阶上到第i阶台阶的方案数等于上到第i-1阶台阶的方案数加上上到第i-2阶台阶的方案数。

解题方法

创建一个dp[]列表存储到达每一级台阶的方案数,使用for循环从小到大逐步求出所有台阶对应的方案数,最后返回dp[n-1]即可

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

class Solution:def climbStairs(self, n: int) -> int:if n == 0:return 0elif n == 1:return 1dp = [0]*(n+1)dp[0], dp[1], dp[2] = 0, 1, 2for i in range(3, n+1):dp[i] = dp[i-1] + dp[i-2]return dp[-1]

根据 动态规划 = 记忆化搜索 的理念可知,本题可以直接使用暴力搜索完成,但算法的复杂度有明显差异。

复杂度

时间复杂度:

O ( 2 n ) O(2^n) O(2n)

空间复杂度:

O ( 1 ) O(1) O(1)

# 使用DFS直接搜索
# 时间复杂度:O(2的n次方)
def f(n)->int:if n <= 0:return 0elif n == 1:return 1elif n == 2:return 2else :return f(n-1)+f(n-2)print(f(int(input())))

二、三角形最小路径和

Problem Two: LCR 100. 三角形最小路径和

题目描述:

给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

输入:

输入一个二维列表表示三角形
例如:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]

输出:

返回一个整数,表示最小路径和。

思路

  • 对第一级台阶,方案数等于1,对第二级台阶,方案数为2(直接迈两级或迈两次一级)
  • 对于第i级台阶(i >= 3)来说,它的前驱台阶可能是i-1,也可能是i-2,所以从第0阶台阶上到第i阶台阶的方案数等于上到第i-1阶台阶的方案数加上上到第i-2阶台阶的方案数。

思路

题目是一个标准的深度优先搜索问题,因为每一层中的元素会多次被使用,所以可以通过创建列表存储到达该点所需要的最小路径和(记忆化搜索)的方式提升效率。记忆化搜索也就是动态规划。

解题方法

自然的方法是自上而下,找出每一层各元素到三角形上顶点的最小路径和,然后在最后一层中选出最小路径。但这种方法中每一层的元素需要分成左端点、中间节点和右端点三类,最后还需要遍历一整行找出最小值,算法的时间复杂度较高。

  1. 最左侧的节点:前驱节点只能是tri[i-1][0]
  2. 最右侧的节点:前驱节点只能是tri[i-1][i-1]
  3. 中间的节点 :前驱节点可以是tri[i-1][j] or tri[i-1][j+1]

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2)

空间复杂度:

O ( n ) O(n) O(n)

# 自上而下计算最小和
def f()->int:# 读取输入n = int(input())tri = []for i in range(n):tri.append([int(j) for j in input().split()])# 算法主体if not tri:# 如果列表为空,返回0return 0rows = len(tri)dp = []# 第一行特殊处理dp.append([tri[0][0]])for i in range(1, rows):temp = []for j in range(i+1):if j == 0:temp.append(tri[i][0]+dp[i-1][0])elif j < i:temp.append(tri[i][j]+min(dp[i-1][j-1], dp[i-1][j]))else:temp.append(tri[i][j]+dp[i-1][j-1])dp.append(temp)return min(dp[-1])
print(f())

算法优化:
通过对题目的观察可知题目不要求找出最短路径中的每一个元素,所以也可以自下而上的查找,存储每一个元素到最后一层的最小路径和。这样每一层只有一种节点(前驱节点一定是 tri[i+1][j] 和 tri[i+1][j+1] 二选一),不必区分左右端点,而且最后只需返回dp[0][0]即可,因为dp[0][0]存储的就是三角形上顶点到三角形最下层的最小路径和。

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2)

空间复杂度:

O ( n ) O(n) O(n)

# 除了自上而下的计算,还可以自下而上地求出dp列表的值
# 在自下而上的过程中,三角形每一层都只有一种节点,更为简单
def f()->int:n = int(input())tri = []for i in range(n):tri.append([int(j) for j in input().split()])# 算法主体# 创建dp列表dp = tri[:]for row in range(n-2, -1, -1):for col in range(row+1):dp[row][col] = min(dp[row+1][col], dp[row+1][col+1]) + tri[row][col]return dp[0][0]print(f())

三、大盗阿福

Problem Three: 信息学奥赛一本通 1301. 大盗阿福

题目描述:

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。
这条街上一共有 N 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。
作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入:

输入的第一行是一个整数T(T≤50) ,表示一共有T组数据。
接下来的每组数据,第一行是一个整数N(1≤N≤100,000) ,表示一共有N家店铺。第二行是N个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过1000。

输出:

对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

思路

分析可知,被选中的两家店之间可能间隔1家店,也可能间隔2家店,但不可能间隔大于等于3家店,因为间隔的三家店中中间的那一家也可以同时被选中,如果不选,则该方案一定不是最优方案。所以本题实质上与爬楼梯相似,都是典型的动态规划题目。

解题方法

创建一个列表dp记录从左向右打劫到每一个店铺时所能获得的最大金额,最后dp中的最大值即为所求。

  • 第一家店铺:最大金额等于该店铺的钱数
  • 第二家店铺:最大金额等于 max(money[0], money[1])
  • 第三家店铺:最大金额等于 max(money[1], money[0]+money[2])
  • 第i(i > 3)家店铺:最大金额等于 money[i-1] + max(dp[i-2], dp[i-3])

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

def f(n, money):# n = len(money)if n == 1:print(money[0])return elif n == 2:print(max(money))returnelif n == 3:print(max(money[1], money[0]+money[2]))return# 初始化dp列表dp = [0]*ndp[0] = money[0]dp[1] = max(money[0], money[1])dp[2] = max(money[1], money[0] + money[2])for i in range(3, n):dp[i] = money[i] + max(dp[i-2], dp[i-3])print(max(dp))t = int(input())
for i in range(t):f(int(input()), [int(k) for k in input().split()])

相关文章:

动态规划入门题目

动态规划&#xff08;记忆化搜索&#xff09;&#xff1a; 将给定问题划分成若干子问题&#xff0c;直到子问题可以被直接解决。然后把子问题的答保存下来以免重复计算&#xff0c;然后根据子问题反推出原问题解的方法 动态规划也称为递推&#xff08;暴力深搜记忆中间状态结果…...

探索云性能测试的各项功能有哪些?

云性能测试作为现代软件开发和部署过程中不可或缺的一环&#xff0c;为确保系统在各种条件下的高效运行提供了关键支持。本文将介绍云性能测试的各项功能&#xff0c;帮助您更好地了解其在软件开发生命周期中的重要性。 1. 负载测试 云性能测试的首要功能之一是负载测试。通过模…...

(大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第一题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; 统计除豪车外&#xff0c;销售最差的车 车辆按批销售&#xff0c;每次销售若干…...

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…...

Python与CAD系列高级篇(二十五)分类提取坐标到excel(补充圆半径、线长度、圆弧)

目录 0 简述1 分类提取坐标到excel2 结果展示0 简述 上一篇中介绍了:对点、直线、多段线、圆、样条曲线分类读取坐标并提取到excel。考虑到进一步提取图形信息,此篇补充对圆半径、线长度以及圆弧几何信息的提取。 1 分类提取坐标到excel 代码实现: import math import nump…...

Linux安装Influxdb

Linux安装Influxdb 1、安装步骤1.1、安装Influxdb步骤1.2、Influxdb默认安装路径1.3、命令行操作Influxdb&#xff0c;建库&#xff0c;建用户1.3.1 进入influxdb命令行1.3.2 创建用户1.3.2 库查询和创建 1、安装步骤 1.1、安装Influxdb步骤 yum install -y wget #下载安装包…...

Flutter CustomPainter 属性介绍与使用

Flutter 中的 CustomPainter 是一个强大的工具&#xff0c;允许开发者通过自定义绘制来创建各种复杂的图形和动画。本文将介绍 CustomPainter 的一些重要属性以及如何使用它们来实现自定义绘制。 1. CustomPainter 简介 CustomPainter 是一个抽象类&#xff0c;用于自定义绘制…...

基于Javaweb开发的二手图书零售系统详细设计【附源码】

基于Javaweb开发的二手图书零售系统详细设计【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…...

【JaveWeb教程】(35)SpringBootWeb案例之《智能学习辅助系统》登录功能的详细实现步骤与代码示例(8)

目录 案例-登录和认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 案例-登录和认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能…...

6.1 内存模式概述

Bruce Powel Douglass大师介绍-CSDN博客 嵌入式软件开发从小工到专家-CSDN博客 C嵌入式编程设计模式源码-CSDN博客 “内存管理模式”介绍了几种内存管理的模式&#xff0c;每种模式都针对特定的系统需求和约束设计。 6.2 静态分配模式&#xff08;Static Allocation Patter…...

Python中容器类型的数据

目录 序列 序列的索引操作 加和乘操作 切片操作 成员测试 列表 创建列表 追加元素 插入元素 替换元素 删除元素 元组 创建元组 元组拆包 集合 创建集合 修改集合 字典 创建字典 修改字典 访问字典视图 遍历字典 若我们想将多个数据打包并且统一管理&…...

虚拟机安装Centos8.5

记得看目录哦&#xff01; 附件1. 新建虚拟机2. 安装Centos8.5 附件 安装包自行下载 https://mirrors.aliyun.com/centos/8/isos/x86_64/ 1. 新建虚拟机 2. 安装Centos8.5 启动虚拟机–选择第一个install Centos8.5 记得接收许可证...

ENVI下基于知识决策树提取地表覆盖信息

基于知识的决策树分类是基于遥感影像数据及其他空间数据,通过专家经验总结、简单的数学统计和归纳方法等,获得分类规则并进行遥感分类。分类规则易于理解,分类过程也符合人的认知过程,最大的特点是利用的多源数据。 决策树分类主要的工作是获取规则,本文介绍使用CART算法…...

arco design table遇到的一些问题

问题1&#xff1a;不知情就成了树形table table中不知道为啥就多了个树形加号在前面&#xff0c;查找问题后发现&#xff0c;是后端返回的数据中有children&#xff0c;框架中默认对这个参数做了树形结构。 解决办法&#xff1a; 当时没找到取消或者修改字段的属性或方法&…...

Linux系统——文本三剑客

目录 一、grep 1.格式 2.选项 2.1 grep重定向 2.2grep -m 匹配到几次停止 2.3grep -i 忽略大小写 2.4grep -n 显示行号 2.5grep -c 统计匹配行数 2.6grep -A 后几行 2.7grep -C 前后三行 2.8grep -B 前三行 2.9grep -e 或 2.10grep -w 匹配整个单词 2.11grep -r…...

代码随想录算法训练营Day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 动态规划理论基础 什么是动态规划 动态规划的解题步骤 动态规划的debug 509. 斐波那契数 前言 思路 算法实现 方法一&#xff1a;动态规划 方法二&#xff1a;递归法 70. 爬楼梯 前言 思路 算法实现 拓展 746. 使用最小花费爬楼梯 算法实现 总结 动态规划…...

C++中的指针空值nullptr

一、nullptr的引入 在C98中&#xff0c;通常是用NULL或者0对指针变量进行初始化 int* p1 NULL; int* p2 0; NULL其实一个宏&#xff0c;本质是0&#xff0c;在传统C头文件stddef.h中给可以看到如下代码 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define …...

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.1.29 前言&#xff1…...

vite+ts+vue3打包的过程和错误

文章目录 概要vite.config.ts配置tsconfig.json 的配置package.json 的配置路由配置打包打开打包后的文件小结 概要 完成vite的打包&#xff0c;和在本地打开页面 记录一下&#xff0c;vite打包过程中的问题!!! vite.config.ts配置 vite.config.ts配置打包的相关配置 import…...

80.双指针实现删除有序数组中的重复项 II(中等)-面试经典150题

题目 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...