7 动态规划

news2024/11/16 6:59:50

下面的例子不错: 对于动态规划,能学到不少东西;

你要清楚每一步都在做什么,划分细致就能够拆解清楚!

 xk​​​​​​​. - 力扣(LeetCode)

labuladong的算法笔记-动态规划-CSDN博客

动态规划是一种强大的算法设计策略,用于解决具有重叠子问题和最优子结构特点的问题。在面对动态规划类题目时,遵循以下步骤可以帮助你系统地解决问题:

1. 定义状态

  • 确定变量:识别哪些变量会影响问题的解。例如,在背包问题中,关键变量可能是物品的重量和价值,以及剩余的背包容量。
  • 状态表示:用这些变量定义状态。例如,dp[i][w] 可能表示前i个物品放入容量为w的背包所能获得的最大价值。

2. 状态转移方程

  • 建立关系:找到状态之间的关系,即如何从一个状态转移到另一个状态。这通常涉及到一个递推公式。例如,在斐波那契数列中,F(n) = F(n-1) + F(n-2)
  • 边界条件:确定递推公式的起始状态,通常是最简单的情况,例如 dp[0][w] = 0(背包问题中没有物品时的价值)。

3. 选择方向

  • 自底向上:从最简单的状态开始,逐步构建更复杂的状态。这种方法通常使用循环实现,避免了重复计算。
  • 自顶向下:从复杂的状态开始,递归地解决子问题。这种方法通常使用递归和记忆化(memoization)来避免重复计算。

4. 初始化

  • 初始状态:根据问题的性质初始化DP数组。例如,所有状态初始化为0或无穷大。

5. 计算

  • 填充DP表:根据状态转移方程填充DP表或数组。确保按正确的顺序填充,以便在计算每个状态时,所需的前驱状态已经被计算。

6. 返回结果

  • 解析答案:DP过程完成后,根据问题要求解析出最终答案。这可能是DP表中的某个特定值,也可能是回溯整个DP过程找到最优解的具体方案。

7. 复杂度分析

  • 时间复杂度:通常由状态的数量和状态转移的复杂度决定。
  • 空间复杂度:由存储状态所需的空间决定,可以通过滚动数组等方式优化空间复杂度。

1 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

这是一个简单的动态规划的问题:

分解问题:不积硅步无以至千里!

假设:当前到了第x层,并且小于x层的走法f(x)我们都知道。

那么后面如何求呢?

  1. 第一个阶梯、第二个阶梯都是1下就能走到!
  2. y = x+1,那么 f(y) = f(y-1) + f(y-2), 想要上到第y步, 一定是从前面阶梯走过来的。

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

2 198. 打家劫舍 

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

相邻不能同时偷!

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

在做这一个题目的时候:

f(x): 到第x个房间能得到的最大收益;

我也是设定:加入到了第X个房间,那么之前的状态(到房间能得到的最大收益)我都是知道的。所以,f(X+1) 怎么做才能最大呢?

怎么能偷到x+1个房子,由x-1过来的,x-2过来的(开始我没考虑到这点)。

class Solution:
    def rob(self, nums: List[int]) -> int:
        dp = nums[::]

        for i in range(2,len(nums)):
            temp = dp[i-2]
            if i-3>=0:
                temp = max(temp,dp[i-3])
            dp[i] = temp + nums[i]
        
        return max(dp)

3 322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1
  1. 递归;
  2. 动态规划;

有硬币:【q,w,e】

思想: 

比如7个硬币怎么使用最少的硬币进行组合呢?

f(7) = min(f(7-q),f(7-w),f(7-e)) + 1

还有个特殊条件: f(7-q),f(7-w),f(7-e) 存在组合(基石,不然无法站住脚);

我这个思路不是特征的好。

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:

        if amount==0:
            return 0 
            
        coins = sorted(coins)

        dp = [0] * (amount+1)

        for i in range(amount+1):
            for coin in coins:
                if i-coin==0:
                    dp[i] = 1
                elif i-coin>0:
                    if dp[i]==0:
                        # 
                        if dp[i-coin]==0:
                            dp[i]==0
                        else:
                            dp[i] = dp[i-coin] + 1 #min(, dp[i])
                    else:
                        if dp[i-coin]==0:
                            dp[i]==0
                        else:
                            dp[i] = min(dp[i-coin] + 1, dp[i])
                else:
                    break
        print(dp)
        return -1 if dp[amount]==0 else dp[amount]

        
        
        # def sub_x(amount):
        #     if amount==0:
        #         return 0

        #     if amount < 0 or amount<coins[0]:
        #         return -1

        #     temp = -1
        #     for coin in coins:
        #         x = sub_x(amount - coin) # -1, >=0
        #         if x == -1:
        #             continue
        #         if temp==-1:
        #             temp = x+1
        #         else:
        #             temp = min(x+1, temp)
        #     return temp

        return sub_x(amount)


思路二 :陈奕迅的背包

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        
        n = len(coins)
        dp = [[amount+1] * (amount+1) for _ in range(n+1)]    # 初始化为一个较大的值,如 +inf 或 amount+1
        # 合法的初始化
        dp[0][0] = 0    # 其他 dp[0][j]均不合法
        
        # 完全背包:套用0-1背包【遍历硬币数目k】
        for i in range(1, n+1):                     # 第一层循环:遍历硬币
            for j in range(amount+1):               # 第二层循环:遍历背包
                for k in range(j//coins[i-1]+1):    # 第三层循环:当前硬币coin取k个 (k*coin<=amount)
                    dp[i][j] = min( dp[i][j], dp[i-1][j-k*coins[i-1]] + k )

        ans = dp[n][amount] 
        return ans if ans != amount+1 else -1

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

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

相关文章

VulnHub靶场之DarkHole_1

1 信息收集 1.1 主机发现 arp-scan -l 主机IP地址为&#xff1a;192.168.1.17 1.2 端口和服务扫描 nmap -sS -sV -A -T5 -p- 192.168.1.17 开放22&#xff0c;80端口 1.3 目录扫描 dirsearch -u 192.168.1.17 2 渗透 2.1 访问端口 2.2 注册账号 暴力破解不现实&#…

大语言模型在时空分析中的能力评估

这篇论文的标题是《STBench: Assessing the Ability of Large Language Models in Spatio-Temporal Analysis》&#xff0c;由Wenbin Li等人撰写。本文提出了一个名为STBench的基准&#xff0c;用于评估大型语言模型&#xff08;LLMs&#xff09;在时空分析中的能力。以下是对论…

ESP32CAM物联网教学04

ESP32CAM物联网教学04 给小车配个显示屏 小智决定给小车增加一块显示屏&#xff0c;让小车看起来更好看一些。 点灯物联控制小车的行驶方向 淘宝上面可以使用的液晶显示屏种类非常多&#xff0c;&#xff08;输入OLED搜索&#xff09;经过挑选&#xff0c;选中了这一块&#…

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…

学习笔记——动态路由——OSPF(邻接/邻居)

十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中&#xff0c;为了交换链路状态信息和路由信息&#xff0c;邻居设备之间首先要建立邻接关系&#xff0c;邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…

《操作系统真象还原》学习笔记:第1章 部署工作环境

**提示&#xff1a;**这篇文章是根据学长提供的教程《操作系统真象还原》第一章 部署工作环境来完成的&#xff0c;我按照学长给的教程一步一步做下来&#xff0c;再结合《操作系统真象还原》这本书&#xff0c;对实验环境进行了配置。以下是我按照教程进行搭建的记录&#xff…

【RocketMQ】记录一次RocketMQ消费延迟问题排查思路

文章目录 背景问题排查Consumer负载均衡机制订阅关系的一致 背景 业务团队反馈使用我提供的RocketMQ集群&#xff0c;上游生产的消息&#xff0c;部分消息&#xff0c;消费程序需要等1分钟&#xff0c;甚至几分钟后&#xff0c;才能收到。 问题排查 见怪不怪&#xff0c;大部…

构建大数据生态:Sqoop、Hadoop、IDEA和Maven的完整安装与数据预处理指南【实训Day03】

一、Sqoop安装 1 上传安装包并解压缩(在hadoop101上) # cd /opt/software 点击xftp上传sqoop的安装文件sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz # tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/ # cd /opt/module/ # mv s…

Webpack: 三种Chunk产物的打包逻辑

概述 在前文 Webpack: Dependency Graph 管理模块间依赖 中&#xff0c;我们已经详细讲解了「构建」阶段如何从 Entry 开始逐步递归读入、解析模块内容&#xff0c;并最终构建出模块依赖关系图 —— ModuleGraph 对象。本文我们继续往下&#xff0c;讲解在接下来的「封装」阶段…

全面解析自然语言处理(NLP):基础、挑战及应用前景

自然语言处理 (NLP) 简介与应用前景 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算语言学的一个分支&#xff0c;致力于使计算机能够理解、解释和生成人类语言。这篇博文将深入探讨自然语言处理的基础知识、挑战、典型任务及其广泛的应用前景。 一、自然语言处理的…

路由的基本使用

1.安装 npm i vue-router3 2.引入 import VueRouter from vue-router 3.使用 Vue.use(VueRouter) 4.在src目录下创建router 5.创建两个组件 5.1创建About组件 <template><div> <h1>我是About的内容</h1></div> </template><script> …

计算机操作系统部分选填及大题整理

并发和&#xff08; 共享 &#xff09; 是操作系统的两个最基本的特征,&#xff08; 虚拟 &#xff09;和&#xff08; 异步 &#xff09; 是操作系统的重要特征&#xff0c;并发执行的程序失去可再现性现代操作系统的两个基本特征是&#xff08;程序的并发执行&#xff09;和资…

AC7801时钟配置流程

一 默认配置 在启动文件中&#xff0c;已经对时钟进行了初始化&#xff0c;默认按外部8M晶振&#xff0c;配置系统时钟为48MHZ&#xff0c;APB为系统时钟的2分频&#xff0c;为24MHZ。在system_ac780x.c文件中&#xff0c;可以找到下面这个系统初始化函数&#xff0c;里面有Se…

layui-表格

1.使用方法 加上table标签 加上classlayui-table colgroup是列属性 tr是行td是列 thead是表头&#xff0c;后面一一对应 2.基础属性 加lay-even逐行换色 加lay-skin 设置边框风格

windows上安装Frida环境

python安装 下载地址 Python Release Python 3.12.4 | Python.org python安装好后&#xff0c;使用如下命令安装frida客户端 pip install frida-tools 使用frida --version 查看frida版本 安装手机模拟器&#xff08;雷电模拟器&#xff09; 我的版本是4.0.61 查看CPU架构 adb …

昇思25天学习打卡营第15天 | Vision Transformer图像分类

内容介绍&#xff1a; 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transformer模型的提出&#xff0c;极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性&#xff0c;它已经能够训练…

Cmake静态库与动态库的构建与使用

项目目录 各个文件 myhell.h // // Created by glt on 2024/7/3. //#ifndef MY_PRO_HELLO_H #define MY_PRO_HELLO_H#include <iostream>void HelloFunc();#endif //MY_PRO_HELLO_Hhello.cpp // // Created by glt on 2024/7/3. // #include "myhello.h"voi…

postman请求访问:认证失败,无法访问系统资源

1、使用postman时&#xff0c;没有传入相应的token&#xff0c;就会出现这种情况&#xff0c;此时需要把token放进去 发现问题: { "msg": "请求访问&#xff1a;/getInfo&#xff0c;认证失败&#xff0c;无法访问系统资源", "code": 401 } 1…

#数据结构 笔记一

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构是带有结构特性的数据元素的集合&#xff0c;它研究的是数据的逻辑结构和物理结构以及它们之间的相互关系&#xff0c;并对这种结构定义相适应的运算&#xff0c;…

Harbor简易安装

1.下载tgz 2.解压 3.修改配置文件 配置文件内容如下&#xff1a;简单粘个自己去改 4.harbor中执行安装 5.命令 启动&#xff1a; docker compose -f docker-compose.yml up -d关闭&#xff1a; docker compose -f docker-compose.yml stop 6.访问harbor 访问地址&#xff1a…