代码学习记录36---动态规划

随想录日记part36

t i m e : time: time 2024.04.04



主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及三个方面:
爬楼梯(进阶);零钱兑换 ;完全平方数 。



动态规划五部曲:
【1】.确定dp数组以及下标的含义
【2】.确定递推公式
【3】.dp数组如何初始化
【4】.确定遍历顺序
【5】.举例推导dp数组

Topic1爬楼梯 (进阶)

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

输入描述:

输入共一行,包含两个正整数,分别表示n, m

输出描述:

输出一个整数,表示爬到楼顶的方法数。

输入: 3   2 3\ 2 3 2
输出: 3 3 3

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。
2.确定递推公式:
递推公式为:dp[i] += dp[i - j]
3.dp数组如何初始化
dp[0] 一定为1
4.确定遍历顺序
5.举例推导dp数组
代码如下:

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]是指爬到第i阶方法数
        int[] dp=new int[n+1];
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i-j>=0)dp[i]+=dp[i-j];
            }
        }
        System.out.println(dp[n]);
    }
}

时间复杂度 O ( n ∗ m ) O(n*m) O(nm)
空间复杂度 O ( n ) O(n) O(n)



Topic2零钱兑换

题目:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。
输入: c o i n s = [ 1 , 2 , 5 ] , a m o u n t = 11 coins = [1, 2, 5], amount = 11 coins=[1,2,5],amount=11
输出: 3 3 3
解释: 11 = 5 + 5 + 1

思路:

按照上面的五个步骤进行分析:
1.确定dp数组以及下标的含义
dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
2.确定递推公式
递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
3.dp数组如何初始化
首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
其他下标对应的数值呢?
考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。所以下标非0的元素都是应该是最大值。
4.确定遍历顺序
5.举例推导dp数组

整体代码如下:

class Solution {
    public int coinChange(int[] coins, int amount) {
        // dp[i]表示i金额需要的最少硬币数
        int[] dp = new int[amount + 1];
        for (int j = 0; j < dp.length; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j <= amount; j++) {
                if (dp[j - coins[i]] != Integer.MAX_VALUE)
                    dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]);
            }
        }
        if (dp[amount] == Integer.MAX_VALUE)
            return -1;
        return dp[amount];

    }
}

时间复杂度 O ( n ∗ a m o u n t ) O(n * amount) O(namount)
空间复杂度 O ( a m o u n t ) O(amount) O(amount)



Topic3完全平方数

题目:

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

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

思路:

按照上面的五个步骤进行分析:
1.确定dp数组以及下标的含义
dp[j]:和为j的完全平方数的最少数量为dp[j]
2.确定递推公式
所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);
3.dp数组如何初始化
dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。
4.确定遍历顺序
5.举例推导dp数组

整体代码如下:

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        for (int j = 0; j < dp.length; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                if (i >= j * j)
                    dp[i] = Math.min(dp[i - j * j] + 1, dp[i]);
            }
        }
        if (dp[n] == Integer.MAX_VALUE)
            return -1;
        return dp[n];

    }
}

时间复杂度 O ( n ∗ √ n ) O(n*√n) O(nn)
空间复杂度 O ( n ) O(n) O(n)

相关推荐

  1. 代码学习记录36---动态规划

    2024-04-07 00:28:03       24 阅读
  2. 代码学习记录39---动态规划

    2024-04-07 00:28:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 00:28:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 00:28:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 00:28:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 00:28:03       20 阅读

热门阅读

  1. windbg托管内存泄漏排查

    2024-04-07 00:28:03       23 阅读
  2. .NET 设计模式—适配器模式(Adapter Pattern)

    2024-04-07 00:28:03       24 阅读
  3. Dijkstra求最短路

    2024-04-07 00:28:03       42 阅读
  4. 接口的应用

    2024-04-07 00:28:03       22 阅读
  5. 设计模式面试题(七)

    2024-04-07 00:28:03       17 阅读
  6. PyTorch中,with torch.no_grad():

    2024-04-07 00:28:03       17 阅读
  7. mysql中 insert into...select语句优化

    2024-04-07 00:28:03       18 阅读
  8. Qt Remote Objects (QtRO) 笔记

    2024-04-07 00:28:03       15 阅读