【随想录】Day45—第九章 动态规划part07

server/2024/10/18 19:25:38/

目录

  • 题目1: 70. 爬楼梯(进阶版)
    • 1- 思路
      • 动规五部曲
    • 2- 题解
      • ⭐爬楼梯——题解思路
  • 题目2: 零钱兑换
    • 1- 思路
      • 动规五部曲
    • 2- 题解
      • ⭐零钱兑换——题解思路
  • 题目3:完全平方数
    • 1- 思路
      • 动规五部曲
    • 2- 题解
      • ⭐完全平方数——题解思路


题目1: 70. 爬楼梯(进阶版)

  • 题目链接:卡码网:57. 爬楼梯

1- 思路

动规五部曲

  • 1. 确定 dp 数组含义
    • dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。
  • 2. 确定递推公式
    • dp[j] += dp[j-i]
  • 3. dp 数组初始化
    • 既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。
  • 4. 遍历顺序(所求为组合,因此需要先遍历背包再遍历物品)
    • 这是背包里求排列问题,即:1、2 步 和 2、1 步都是上三个台阶,但是这两种方法不一样!
    • 所以需将target放在外循环,将nums放在内循环。
    • 每一步可以走多次,这是完全背包,内循环需要从前向后遍历。

2- 题解

⭐爬楼梯——题解思路

在这里插入图片描述


import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();  // 楼梯数    ——> 背包int m = sc.nextInt();  // 可以爬的台阶 ——> 商品// 1. 定义dp数组// 爬到 j 阶的种类数int[] dp = new int[n+1];// 2. 递推公式// dp[j] += dp[j-weight[i]]// 3. 初始化dp[0] = 1;// 4. 遍历顺序// 所求的是种类 所以 1 2 方式和 2 1 是不一样的// 先遍历背包 后 遍历 物品// 背包:从 小到大 j 从 1 到 n// 物品:从 小到大 i 从 1 到 mfor(int j = 1 ; j <= n;j++){for(int i = 1 ; i <= m ;i++){if(j-i>=0){dp[j] += dp[j-i];}}}System.out.println(dp[n]);}}
}

题目2: 零钱兑换

  • 题目链接:322. 零钱兑换

1- 思路

动规五部曲

  • 1. 确定 dp 数组含义
    • dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
  • 2. 确定递推公式
    • 凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])
    • 所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。
    • 递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
  • 3. dp 数组初始化
    • 先初始化所有数组值为 Integer.MAX_VALUE
    • 首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
  • 4. 遍历顺序(所求为组合,因此需要先遍历背包再遍历物品)
    • 所以本题并不强调集合是组合还是排列。
    • 如果求组合数就是外层for循环遍历物品,内层for遍历背包
    • 如果求排列数就是外层for遍历背包,内层for循环遍历物品
    • 所以本题的两个for循环的关系是:外层for循环遍历物品,内层for遍历背包或者外层for遍历背包,内层for循环遍历物品都是可以的!

2- 题解

⭐零钱兑换——题解思路

在这里插入图片描述

class Solution {public int coinChange(int[] coins, int amount) {// 背包:amount// 物品:coins// 求:最少硬币数// 确定 dp 数组含义int[] dp = new int[amount+1];// 2. 确定递推公式// dp[j] = Math.min(dp[j],dp[j-weight[i]]+value[i]);// 3. 初始化int max = Integer.MAX_VALUE;for (int j = 0; j < dp.length; j++) {dp[j] = max;}dp[0] = 0;// 4. 确定遍历顺序// 先遍历 背包 后遍历 商品for(int i = 0 ; i < coins.length;i++ ){for(int j = coins[i] ; j <= amount ;j++){//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要if (dp[j - coins[i]] != max){dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);}}}return dp[amount] == max ? -1 : dp[amount];}
}

题目3:完全平方数

  • 题目链接:279. 完全平方数

1- 思路

动规五部曲

  • 1. 确定 dp 数组含义
    • dp[j]:和为j的完全平方数的最少数量为dp[j]
  • 2. 确定递推公式
    • dp[j] 可以由 dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]
    • 此时我们要选择最小的 dp[j] ,所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j])
  • 3. dp 数组初始化
    • dp数组初始化为 max
    • dp[0] = 0
  • 4. 遍历顺序(所求为组合,因此需要先遍历背包再遍历物品)
    • 先遍历物品 再 遍历背包

image.png


2- 题解

⭐完全平方数——题解思路

在这里插入图片描述

class Solution {public int numSquares(int n) {// 1. 定义 dp 数组// 组成数字 i 的最小 完全平方数的个数int[] dp = new int[n+1];int max = Integer.MAX_VALUE;for (int j = 0; j <= n; j++) {dp[j] = max;}// 2. 递推公式// dp[j] = Math.min(dp[j],dp[j-weight[i]]+1);// 3. 初始化dp[0] = 0;// 4. 遍历顺序// 先遍历商品// 再遍历背包for(int i = 1 ; i*i <= n;i++){for(int j = i*i ; j <= n;j++ ){dp[j] = Math.min(dp[j-i*i]+1,dp[j]);}}return dp[n];}
}


http://www.ppmy.cn/server/40368.html

相关文章

地球洋流地图

Earth Null School 以其对我们星球的凉爽风和温度可视化而闻名。但地球 Nullschool 的一个鲜为人知的网络地图是他们的洋流地图。 如你所见&#xff0c;热水从赤道流向两极。例如&#xff0c;墨西哥湾流将暖空气推向欧洲&#xff0c;由于热水流经大西洋&#xff0c;使气候更加…

最佛系的打字练习软件——TL(TypeLetters)

有朋友开玩笑说&#xff1a;TL&#xff08;TypeLetters&#xff09;是最佛系的打字练习软件。真的吗&#xff1f;仔细看&#xff0c;好像还真有这么点意思&#xff1a; 无竞速&#xff1a;TL没有速度显示&#xff0c;初学者逐个认清键位&#xff0c;无需关心速度&#xff0c;中…

Android进阶之路 - 静态会员进度条

年后这个新版本加入了VIP模块&#xff0c;有幸正好由我来负责&#xff0c;可以再积累一下这方面的知识。 那段时间看了一本书&#xff0c;书中说到初级码农的特性之一就是完全集中于某些功能&#xff0c;忽略了了很多成长机会&#xff0c;所以重复性劳作带来的成长值有限&#…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

Flink面试整理-如何提高Flink处理数据的效率和吞吐量

提高 Apache Flink 处理数据的效率和吞吐量通常涉及对配置、代码设计和资源管理的优化。以下是一些关键的策略: 1. 优化并行度 调整并行度:并行度应根据可用的硬件资源(如 CPU 核心数)进行调整。不同的算子可以有不同的并行度。确保数据均衡分配:避免某些任务过载而其他任…

Android studio 打开Device Mirroring方便调试

巧合下发现一个很好用的工具&#xff0c;在平时调试真机的时候在每次run app后都要低头找找手机看看效果。但是&#xff0c;用了AS上的Device Mirroring&#xff0c;你会发现根本不需要再低头点手机&#xff0c;调试方便一万倍啊。 话不多说&#xff0c;上图。直接就可以在电脑…

mysql中sql语句 exists 判断子句的用法

如果子查询成立才执行父查询 exists判断子查询的使用例子&#xff1a; 张三不存在所以前面的父查询不执行 后面的子句结果存在&#xff0c;所以前面的父查询被执行 where条件所连接的嵌套子查询都是&#xff0c;条件子查询 ———————————————————————…

最小生成树刷题笔记

算法基础&#xff1a; 最小生成树是所有节点的最小连通子图&#xff01;&#xff01;&#xff01;&#xff01; 首先是prim算法三部曲&#xff1a; &#xff08;1&#xff09;找到距离最小生成树最近的节点。 &#xff08;2&#xff09;将距离最小生成树最近的节点加入到最…