代码随想录算法训练营第四十五天|57. 爬楼梯、322.零钱兑换、279. 完全平方数

news2024/11/18 20:45:31

KamaCoder 57. 爬楼梯
题目链接:题目页面 (kamacoder.com)

这道题使用完全背包来实现,我们首先考虑的是总的楼梯数,因此dp数组大小为n + 1 ,其意义是,在n阶时有多少种方法爬到楼顶,因此,当前n状态等于前面状态(1, m)状态之和。

每道题都要考虑dp五步:

1)确定dp数组下标与值的关系:满足凑出总楼梯的组合数

2)确定递推公式:我们把n个数组成看作1与n-1个组成,使用分而治之的思路来处理,dp[i] += dp[i - j]

3)确定初始值:dp[0]为1,没得选

4)确定遍历的数:注意一下边界问题

5)带入验证一下

代码:

#python acm模式
while True:
    try:
        n, m = map(int, input().split())
        dp = [0 for _ in range(n + 1)]  //dp数组大小为n+1
        dp[0] = 1  //初始化dp[0]
        for i in range(1, n + 1):  //从1开始,从0没意义
            for j in range(1, min(i, m) + 1):   //从前往后,遍历可能的楼梯数
                    dp[i] += dp[i - j]
        print(dp[n])
    except:
        break

LeetCode 322.零钱兑换
题目链接:322. 零钱兑换 - 力扣(LeetCode)

这道题使用完全背包来实现,要求的组成整数amount的最小硬币组合数,因此dp数组大小为n + 1 ,其意义是,在n阶时最小的硬币数量,因此,当前n状态等于前面状态的最小值。

每道题都要考虑dp五步:

1)确定dp数组下标与值的关系:满足凑出目标金额的最少硬币数量

2)确定递推公式:dp[i] = min(dp[i], dp[i - coin] + 1) (后面这个意思是从前coin的位置递推过来,加上一个硬币数)

3)确定初始值:dp[0]为0,当目标为0时当然一个硬币也不要

4)确定遍历的数:注意一下i要大于等于当前coin,否则数组会越界

5)带入验证一下

代码:

#python   //DFS
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dfs
        n=len(coins)
        @cache   //用一个装饰器
        def dfs(i,c):
            if i<0:  //判定结束条件
                return 0 if c==0 else inf
            if c<coins[i]: //确定一下coin
                return dfs(i-1,c)
            return min(dfs(i-1,c),dfs(i,c-coins[i])+1)  //返回最小的硬币数量,递归
        res=dfs(n-1,amount)  //结果
        return res if res<inf else -1  //看下结果呗,要么有,没有就-1
#python   //二维DP
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        n=len(coins)  //一共有n个硬币数量
        dp=[[inf]*(amount+1) for _ in range(n+1)]  //二维dp数组
        dp[0][0]=0  //初始化一下
        for i,x in enumerate(coins):  //使用枚举,把键与值分离
            for c in range(amount+1):   //同样的是在金额内部
                if c<x:    //当前的值放不下硬币了
                    dp[i+1][c]=dp[i][c]
                else:  //放得下,比较一下
                    dp[i+1][c]=min(dp[i][c],dp[i][c-x]+1)
        res=dp[n][amount]
        return res if res < inf else -1没有就-1
#python   //一维DP
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        n = len(coins)
        dp = [float('inf') for _ in range(amount + 1)]
        dp[0] = 0
        for i in range(1, amount + 1):
            for coin in coins:
                if i >= coin:
                    dp[i] = min(dp[i], dp[i - coin] + 1)
        return dp[-1] if dp[-1] < float('inf') else -1

LeetCode 279. 完全平方数
题目链接:279. 完全平方数 - 力扣(LeetCode)

和前面的做法异曲同工,注意一下范围就是

每道题都要考虑dp五步:

1)确定dp数组下标与值的关系:满足凑出目标金额的最少完全平方数数量

2)确定递推公式:dp[i] = min(dp[i], dp[i - j ** 2] + 1) (后面这个意思是从前j**2的位置递推过来,加上一个完全平方数)

3)确定初始值:dp[0]为0,当目标为0时当然完全平方数

4)确定遍历的数:注意一下i要大于等于当前j**2,否则数组会越界

5)带入验证一下

代码:

#python  一维dp
class Solution:
    def numSquares(self, n: int) -> int:
        dp = [inf for _ in range(n + 1)]
        dp[0] = 0
        for i in range(1, n + 1):
            for j in range(1, int(math.sqrt(i)) + 1): //从小于当前i的平方根数来
                dp[i] = min(dp[i], dp[i - (j ** 2)] + 1)
        return dp[-1]

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

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

相关文章

MVCC多版本并发控制相关面试题整理

多版本并发控制是一种用于支持并发事务的数据库管理系统技术&#xff0c;它允许多个事务同时访问数据库&#xff0c;而不会相互干扰或导致数据不一致。MVCC通过在数据库中维护不同版本的数据来实现这一目标&#xff0c;从而允许每个事务看到一致的数据库快照。 并发导致的问题…

基于51单片机的人体追踪可控的电风扇系统

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要概述硬件组成工作原理优势应用场景总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于51单片机的人体追踪可控的电风扇系统介绍 概述 该系统是基于51…

王者农药小游戏

游戏运行如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…

【教学类-06-09】20231125 (55格版)X-Y之间“加法减法+-题” (以10-20之间为例)(加法的正序+逆序,减法的正序,题目多)

图片展示 需求&#xff1a; 20以内加法减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的加法减法&#xff0c;X-Y大于10&#xff0c;小于20的所有加法减法题。 代码展示&#xff1a; X-Y 之间的所有加减混合法题&#xff08;如10-20之间的所有加法减法…

Proteus仿真--基于DS1302与1602LCD设计的可调式电子日历与时钟

本文介绍基于51单片机的DS1302与1602LCD可调式电子日历与时钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用LCD1602模块&#xff0c;按键K1-K4&#xff0c;K1用于年月日时分选择&#xff0c;K2用于…

前端入门(三)Vue生命周期、组件技术、脚手架、存储、事件总线、

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混…

【数据结构实验】排序(三)快速排序算法的改进(三者取中法)

文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法&#xff0c;其核心思想是通过选择一个基准元…

从0到0.01入门 Webpack| 003.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

c语言刷题12周(1~5)

输入年月日&#xff0c;显示这一天是这一年的第几天&#xff0c;保证输入日期合法。 题干输入年月日&#xff0c;显示这一天是这一年的第几天&#xff0c;保证输入日期合法。输入样例2022 1 1 2022 12 31 2024 12 31 2022 4 5输出样例2022-1 2022-365 2024-366 2022-9…

辅助驾驶功能开发-外部需求篇-导航式巡航辅助NCA外部依赖及需求

1.功能外部依赖 为了设计满足用户需求的 ICA/NCA 系统,需要用到的系统输入为:环境及驾驶员感知信息、 门锁监测信息、胎压监测信息、驾驶员权限管理、车辆模式管理信息、用户请求输入、转向系统 信息、惯性及导航定位信息、被动安全及约束信息、变速箱系统信息、制动系…

Redis大key与热Key

什么是 bigkey&#xff1f; 简单来说&#xff0c;如果一个 key 对应的 value 所占用的内存比较大&#xff0c;那这个 key 就可以看作是 bigkey。具体多大才算大呢&#xff1f;有一个不是特别精确的参考标准&#xff1a; bigkey 是怎么产生的&#xff1f;有什么危害&#xff1f;…

3.2 CPU的自动化

CPU的自动化 改造1-使用2进制导线改造2根据整体流程开始改造指令分析指令MOV_A的开关2进制表格手动时钟gif自动时钟gif 根据之前的CPU内部结构改造,制造一个cpu控制单元 改造一 之前的CPU全由手动开关自己控制,极度繁琐,而开关能跟二进制一一对应, 开:1, 关:0图1是之前的, …

2017年7月13日 Go生态洞察:向Go 2迈进

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

手撕AVL_二叉平衡树(图文并茂)

目录 前言 一 . AVL树的概念 二 . AVL树节点的定义 三 . AVL树的插入 1.插入节点 2.调节负载因子 四 . AVL树的旋转 1.左单旋 2.左右双旋 五 . AVL树性能分析 总结 前言 大家好,今天带大加手撕AVL树的插入 一 . AVL树的概念 二叉搜索树虽可以缩短查找的效率&#x…

process control 化学工程 需要用到MATLAB的Simulink功能

process control 化学工程 需要用到MATLAB的Simulink功能 所有问题需要的matlab simulink 模型 WeChat: ye1-6688 The riser tube brings in contact the recirculating catalyst with the feed oil, which then vaporizes and splits to lighter components as it flows up th…

【ArcGIS Pro微课1000例】0038:基于ArcGIS Pro的人口密度分析与制图

文章目录 一、人口密度二、人口密度分析1. 点密度分析2. 核密度分析三、结果比对一、人口密度 人口密度是指单位土地面积上居住的人口数,通常以每平方千米或每公顷内的常住人口为单位计算。人口密度同资源、经济密切结合,因此,科学准确地分析人口密度的分布情况,对合理制定…

当你准备开始学习 Java 时,确保已完成以下准备工作,安装Java开发环境并验证通过。

当你准备开始学习 Java 时&#xff0c;确保已完成以下准备工作&#xff1a; a. 安装Java开发环境 下载Java Development Kit (JDK)&#xff1a; 访问Oracle官方网站&#xff0c;选择适用于你操作系统的JDK版本&#xff0c;点击下载。 安装JDK&#xff1a; 下载完成后&#xf…

window获取密码工具

工具getpass.exe 运行输出密码到5.txt 工具gethashes.exe 运行之后输入到6.txt,会得到一个$local 再运行gethashes.exe $local 可以看到加密的账户密码&#xff0c;用工具进行解密就可以得到密码 工具pwdump7 还有其他的mimikatz&#xff0c;msf工具都可以获取。

如何把自己银行卡里的钱转账充值到自己支付宝上?

原文来源&#xff1a;https://www.caochai.com/article-4524.html 支付宝余额是支付宝核心功能之一&#xff0c;主要用于网购支付、线下支付、转账等场景。用户可以将银行卡、余额宝等资金转入或转出至支付宝余额&#xff0c;实现快速转账和支付。 如何把自己银行卡里的钱转账…

案例-某验四代滑块反爬逆向研究二

系列文章目录 第一部分 案例-某验四代滑块反爬逆向研究一 第二部分 案例-某验四代滑块反爬逆向研究二 文章目录 系列文章目录前言一、js文件加载先后顺序二、每次刷新都会初始化 device_id, 所以追栈可以知道它从哪执行的三、删除node中的检测点&#xff08;vm忽视&#xff09…