算法训练营Day39

#Java #动态规划

Feeling and experiences:

爬楼梯(进阶版):卡码网题目链接

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

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 

注意:给定 n 是一个正整数。

和最初版本的爬楼梯来对比:本题能爬的阶数不再是 1 或 2 ,而是m;

代码如下:

import java.util.*;
public class Main{public static void main(String[] args){//输入Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();//创建dp数组 ,含义:到i级台阶,需要dp[i]种方法int[] dp = new int[n+1];//初始化dp数组dp[0] = 1;//循环 ,递推for(int i = 1;i<=n;i++){ //外层循环:背包for(int j = 1;j<= m;j++){ //内层循环:物品if(i >= j){dp[i]+=dp[i-j];}}}System.out.print(dp[n]);}    
}

这里递推模拟一下:(假如 n = 4,m = 2)

1. 当 i = 1(只有1级台阶):
• 可以从第0级走1级到达第1级,所以 dp[1] = dp[0] = 1。


2. 当 i = 2(有2级台阶):
• 可以从第0级走2级到达第2级,或者从第1级走1级到达。所以 dp[2] = dp[0] + dp[1] = 1 + 1 = 2。


3. 当 i = 3(有3级台阶):
• 可以从第1级走2级到达第3级,或者从第2级走1级到达。所以 dp[3] = dp[1] + dp[2] = 1 + 2 = 3。


4. 当 i = 4(有4级台阶):
• 可以从第2级走2级到达第4级,或者从第3级走1级到达。所以 dp[4] = dp[2] + dp[3] = 2 + 3 = 5。

最终结果,dp[4] = 5,表示到达第4级台阶共有5种方法。

通过这道题,对内外循环再做一个详细的解释:(加深理解)

1. 外层循环 (for(int i = 1; i <= n; i++)):
• 这个循环遍历每一级台阶,从第1级到第 n 级。
• 在每次迭代中,i 表示当前目标台阶。我们要计算到达这一级台阶的所有可能的方法数。
• 外层循环确保了我们逐步建立到达每一级台阶的方法数,这是动态规划的核心特性——使用已解决的子问题来帮助解决更大的问题。


2. 内层循环 (for(int j = 1; j <= m; j++)):
• 对于每一级台阶 i,这个循环考虑所有可能的跳跃步数来到达这一级台阶。
• j 表示从前一个台阶跳跃的步数,它可以从1变化到 m(最大步数)。
• 在每次迭代中,如果 i 大于或等于 j,这意味着可以从 i-j 级台阶跳跃 j 步到达 i 级台阶。我们通过累加 dp[i-j](到达第 i-j 级台阶的方法数)来更新 dp[i]。

零钱兑换:力扣题目链接

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

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

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

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

每种硬币数量是无限的!!!

class Solution {public int coinChange(int[] coins, int amount) {//创建dp数组 ,含义:凑到amount有dp[amount]int []dp = new int[amount+1];Arrays.fill(dp,amount+1);//初始化dp数组dp[0] = 0;//循环,递推for(int i =1;i<=amount;i++){for(int j =0;j< coins.length;j++){if(coins[j] <= i){dp[i] = Math.min(dp[i],dp[i-coins[j]] + 1);}}}return dp[amount] > amount? -1: dp[amount];}
}

为什么会用Arrays.fill 来把dp数组的元素 设置为 amount+1 ;

因为amount + 1,是一个“不可达值”,用于后序的 Math.min()函数 来进行结果的更新。

 外层循环 (for(int i = 1; i <= amount; i++)):
• 遍历所有从 1 到 amount 的金额。
• 每次迭代计算组成金额 i 所需的最少硬币数。


 内层循环 (for(int j = 0; j < coins.length; j++)):
• 遍历每一种硬币的面值。
• 如果当前硬币的面值 coins[j] 小于等于当前金额 i,则考虑使用这枚硬币。
• 使用 Math.min(dp[i], dp[i-coins[j]] + 1) 来更新 dp[i]。这里的 dp[i-coins[j]] + 1 表示如果使用这枚硬币,组成金额 i 所需的硬币数量(当前金额减去硬币面值的最少硬币数 + 这枚硬币)。

完全平方数:力扣题目链接

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

其本质还是背包问题 ,就是把可取的元素变成了平方数,在可取元素上做了改变!

这道题基本和上一个题:零钱兑换 是一样的,按照其模板来写:(先物品再背包)

class Solution {public int numSquares(int n) {//按照 零钱兑换的模板来写//创建dp数组int []dp = new int[n+1];//同理,还是要用到Arrays.fill 来赋值Arrays.fill(dp,n+1);//初始化dp[0] = 0;//循环递推 :先物品再背包for(int i =1;i<=n;i++){for(int j =i*i;j<=n;j++){dp[j] = Math.min(dp[j],dp[j-i*i]+1);}}
return dp[n];}
}

 先背包再物品:(不用Arrays.fill 赋值)

class Solution {// 版本二, 先遍历背包, 再遍历物品public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 当和为0时,组合的个数为0dp[0] = 0;// 遍历背包for (int j = 1; j <= n; j++) {// 遍历物品for (int i = 1; i * i <= j; i++) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
}

“移舟靠岸
案前惟剩空盏
莫怨良辰短
曲终了韵意未完” 

Fighting!

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

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

相关文章

Innosetup 读写注册表,读写INI文件

一.innosetup读写注册表 1.注册表读写字符串 (RegQueryStringValue&#xff0c;RegWriteStringValue) RegQueryStringValue(HKEY_CURRENT_USER, SOFTWARE\SODA, appversion, appversion) RegWriteStringValue(HKEY_CURRENT_USER, SOFTWARE\SODA, appversion, s…

MySQL之多表连接查询、AS别名、扩展内容(information_schema的基本应用)

文章目录 前言一、引入多表连接查询二、多表连接查询案例1.准备对应的库表2.案例 三、AS别名用法示例 四、扩展内容1、information_schema的基本应用2、创建视图示例3、information_schema.tables视图的应用3.1、示例 五、show命令总结总结 前言 第三章内容主要描述了mysql使用…

InternLM第4次课笔记

XTuner 大模型单卡低成本微调实战 1 Finetune介绍 2 XTuner介绍 XTuner中微调的技术&#xff1a; 3 8GB显卡玩转LLM 4 动手实战环节 https://github.com/InternLM/tutorial/tree/main/xtuner

@RequestBody 注解内置的 HttpMessageConverter 实现类来解析请求体

在 Spring MVC 中&#xff0c;RequestBody 注解默认使用内置的 HttpMessageConverter 实现类来解析请求体&#xff0c;并尝试将其转换为方法参数所需的对象类型。如果需要指定解析的数据类型&#xff0c;可以通过在方法参数上添加更具体的注解来实现。 以下是一些常见的用于指…

第九部分 使用函数 (一)

目录 一、简介 二、函数的调用语法 一、简介 在 Makefile 中可以使用函数来处理变量&#xff0c;从而让我们的命令或是规则更为的灵活和具 有智能。make 所支持的函数也不算很多&#xff0c;不过已经足够我们的操作了。函数调用后&#xff0c;函数 的返回值可以当做变量来使用…

YOLOv8 Ultralytics:使用Ultralytics框架进行FastSAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行FastSAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行FastSAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容…

力扣(leetcode)第696题计数二进制字串(Python)

696.计数二进制字串 题目链接&#xff1a;696.计数二进制字串 给定一个字符串 s&#xff0c;统计并返回具有相同数量 0 和 1 的非空&#xff08;连续&#xff09;子字符串的数量&#xff0c;并且这些子字符串中的所有 0 和所有 1 都是成组连续的。 重复出现&#xff08;不同…

uniCloud 云数据库(1)

目录 1&#xff1a;云数据库入门,基本概念了解 1.1 云数据库是关系型还是Nosql? 1.2 uniCloud 云数据库和关系型数据库的对比 1.3 官方文档传送门 2: 基本操作表 创建 在uniCloud web控制台 进行创建 数据表的3个组成部分 通过传统方式操作数据库 获取集合的引用 集…

【Cocotb】cocotbext-axi拓展库

用于Cocotb的AXI接口模块&#xff0c;GitHub仓库: https://github.com/alexforencich/cocotbext-axi 介绍 AXI、AXI lite和AXIStream仿真模型 安装 从pip安装&#xff08;发布版本&#xff0c;稳定&#xff09;&#xff1a; $ pip install cocotbext-axi从git安装&#xf…

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访&#xff0c;使用运营商专线或是采用内网穿透方案&#xff0c;彼此之间究竟有何区别呢&#xff1f; 简单来说&#xff0c;MPLS专线和普通宽带类似是运营商提供的网络租…

ruoyi后台管理系统部署-2-安装mysql

centos7 mysql 安装 1. 手动安装 安装 首先查看系统是否安装了&#xff1a; rpm -qa|grep mariadb rpm -qa | grep mysql systemctl status mysqld find / -name mysql.cnf卸载自带的 mariadb: rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps去官网下载 mysql 安装包&…

【数据结构与算法】之数组系列-20240113

这里写目录标题 一、66. 加一二、121. 买卖股票的最佳时机三、136. 只出现一次的数字四、268. 丢失的数字五、350. 两个数组的交集 II 一、66. 加一 简单 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&…

NVMe系统内存结构 - PRP与PRP List

NVMe系统内存结构 - PRP与PRP List 1 为什么需要PRP2 PRP3 PRP List4 PRP寻址算法4.1 仅PRP1指向数据4.2 PRP1指向数据&#xff0c;PRP2指向数据4.3 PRP1指向数据&#xff0c;PRP2指向PRP List 本文属于《 NVMe协议基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 为什么…

【C++】“Hello World!“

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 ​ 2024.1.14 纪念一下自己编写的第一个C程序 #include<iostream>int main() {/*我的第一个C程序*/std::cout << "Hello world!:>" <<std::endl;ret…

【开发板资料】Arduino NANO 资料分享(引脚分布图、原理图、亮灯程序等)

给出部分参考资料以及来源 引脚分布 PINOUT 来源&#xff1a;Nano | Arduino Documentation https://docs.arduino.cc/hardware/nano PINOUT PINOUT 来源&#xff1a;https://www.tumblr.com/pighixxx/42591353009/arduino-nano-pinout https://www.tumblr.com/pighixxx/…

在关系模式中,如何求所有候选码?

求所有候选码(键)&#xff1a; 根据函数依赖集F&#xff0c;找出L(只在左部传递)、R(只在右部传递)、LR(既出现在左边也出现在右边)找出候选码&#xff0c;候选码一般出现在L处&#xff0c;不可能出现在R处判断在L中找出的候选码是否是唯一候选码&#xff1a; 若L中找出的候选码…

Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K

Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 1. 解题思路2. 代码实现 题目链接&#xff1a;3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 1. 解题思路 这一题我的思路上就是一个二分的思路&#xff0c;先…

C++深入学习之STL:1、容器部分

标准模板库STL的组成 主要由六大基本组件组成&#xff1a;容器、迭代器、算法、适配器、函数对象(仿函数)以及空间配置器。 容器&#xff1a;就是用来存数据的&#xff0c;也称为数据结构。 本文要详述的是容器主要如下&#xff1a; 序列式容器&#xff1a;vector、list 关联…

如何使用手机公网远程访问本地群辉Video Station中视频文件【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&am…