Leetcode 刷题 动态规划

news/2024/6/16 16:02:50 标签: 算法, 动态规划, leetcode

70. 爬楼梯

爬楼梯问题其实是一个完全背包问题!

是求一个排列问题

所以遍历顺序 需将target放在外循环,将nums放在内循环。

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        int[] step = new int[2];
        step[0] = 1;
        step[1] = 2;

        for(int i = 1; i <= n; i++){
            for(int j = 0; j < step.length; j++){
                if(step[j] <= i){
                    dp[i] += dp[i-step[j]];
                }
            }
        }
        return dp[n];
    }
}

322. 零钱兑换

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。

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]必须初始化为一个最大的数

4. 确定遍历顺序

         如果求组合数就是外层for循环遍历物品,内层for遍历背包

         如果求排列数就是外层for遍历背包,内层for循环遍历物品

        所以本题并不强调集合是组合还是排列。

        所以本题的两个for循环的关系是:外层for循环遍历物品,内层for遍历背包或者外层for遍历背包,内层for循环遍历物品都是可以的!

5. 举例推导dp数组

 

class Solution {
    public int coinChange(int[] coins, int amount) {
        int max = Integer.MAX_VALUE;
        int[] dp = new int[amount + 1];
        dp[0] = 0;
        for(int i = 1; i <= amount; i++){
            dp[i] = max;
        }

        for(int i = 0; i < coins.length; i++){
            for(int j = coins[i]; j <= amount; j++){
                if(dp[j - coins[i]] != max){
                    dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
                }
            }
        } 
        return dp[amount] == max ? -1 : dp[amount];
    }
}

279. 完全平方数

题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?

其实和上一题几乎差不多

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n+1];
        int max = Integer.MAX_VALUE;
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
            dp[i] = max;
        }

        for(int i = 1; i * i <= n; i++){
            int squar = i * i;
            for(int j = squar; j <= n; j++){
                if(dp[j - squar] != max){
                    dp[j] = Math.min(dp[j], dp[j - squar] + 1);
                }
            }
        }
        return dp[n];
    }
}


http://www.niftyadmin.cn/n/475562.html

相关文章

python命名规范

Python命名规范 命名原则 1、不能以数字开头&#xff0c;不能出现中文。 2、命名以字母开头&#xff0c;包含数字&#xff0c;字母&#xff08;区分大小写&#xff09;&#xff0c;下划线。 3、不能包含关键字。 1、项目名称 首字母大写大写式驼峰&#xff0c;如&#xff1…

JavaScript代理模式:如何实现对象的动态代理

JavaScript代理模式 在JavaScript中&#xff0c;代理模式是一种常见的设计模式&#xff0c;它允许我们在不改变对象本身的情况下&#xff0c;通过代理对象来控制对象的访问。代理模式可以用于实现缓存、权限控制、远程调用等功能。 代理模式的定义 代理模式是指在访问对象时…

【微服务架构设计和实现】4.9 微服务测试和部署最佳实践

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【4.1 微服务架构概述和设计原则】 第四章&#xff1a;【4.2 服务边界的定义和划分…

升级HarmonyOS 3,通话一步切换更便捷

小伙伴们&#xff0c;今天和大家来聊聊HarmonyOS 3音频播控中心有哪些真香体验。不少朋友可能会脱口而出&#xff1a;一键切换音频App&#xff0c;一键实现音频跨设备流转&#xff0c;还有音频共享。这一次&#xff0c;音频播控中心又带来了新技能——一键切换通话音频。 相信大…

高速电路设计系列分享-熟悉JESD204B(中)

目录 概要 整体架构流程 技术名词解释 技术细节 1.数据链路层 小结 概要 提示&#xff1a;这里可以添加技术概要 随着高速ADC跨入GSPS范围&#xff0c;与FPGA(定制ASIC)进行数据传输的首选接口协JESD204B。为了捕捉频率范围更高的RF频谱&#xff0c;需要宽带RFADC。在其推动下…

[230611] 阅读TPO56 23|21:00-21:30|7:10

目录 03 Urban Heat Islands [4]否定事实信息题 [8]事实信息题 [9]句子插入题 03 Urban Heat Islands [4]否定事实信息题 没有仔细理解题目‼️ 题目问的是有利于热岛效应的是...? vegetation and soil typical of rural areas vegetation属于rural areas的&#xff0c;不…

服务器如何配置支持history模式

88. 服务器如何配置支持history模式 服务器配置支持 history 模式是在使用前端路由时的常见需求&#xff0c;它使得在使用 history API 进行页面导航时&#xff0c;服务器能正确地返回对应的页面内容而不是默认的 404 页面。本文将介绍如何配置服务器以支持 history 模式&…

C语言中的库是什么?如何调用系统提供的库函数?

所谓库&#xff0c;就是一些已经写好了的代码集合&#xff0c;它们提供了一些现成的函数&#xff0c;供我们在编程时使用。这样&#xff0c;我们就不用每次都从头写起了&#xff0c;只需要调用它们就好啦&#xff01;就像是我们在做菜时&#xff0c;不用从头制作酱料&#xff0…