算法|Day39 动态规划7

news/2024/11/23 0:13:22/

LeetCode 70- 爬楼梯 (进阶)

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解题思路

  1. 确定dp数组(dp table)以及下标的含义

dp[j]:爬到第j台阶有多少种方法

  1. 确定递推公式

dp[j] += dp[j - i](i代表物品,也就是每次爬的台阶数,范围是[1,2])

  1. dp数组如何初始化

dp[0]一定要为1,其余全部都初始化为0

  1. 确定遍历顺序

用完全背包的思路来写这题,我们应该先遍历物品,再遍历背包,正序遍历背包容量。

  1. 举例推导dp数组
class Solution {
public:int climbStairs(int n) {vector<int> dp(n+1,0);dp[0] = 1;for(int j=1;j<=n;j++){for(int i=1;i<=2;i++){//i是物品只能取1,2if(j>=i){dp[j] += dp[j-i]; }}}return dp[n];}
};

总结:

  • 注意容量的遍历顺序即可

LeetCode 322- 零钱兑换

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

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

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

解题思路

  1. 确定dp数组(dp table)以及下标的含义

dp[j] 表示:凑成总金额为j,最少用多少枚硬币。

  1. 确定递推公式

本题我们每次取出coins[i]后,就还剩下j-coins[i]需要取,所以我们可以用dp[j-coins[i]]来表示取出取出coins[i]后,我们还需要多少枚硬币,而再+1这个1表示的是当前取硬币,多一个。而我们要选最小的,所以要用min。

我们要凑硬币也就是dp[j] = min(dp[j-coins[i]]+1,dp[j]);

  1. dp数组如何初始化

dp[0] = 0,由于我们要取最小数,所以其余全部初始化为INT_MAX

  1. 确定遍历顺序

数字正序遍历,背包容量正序遍历,如果是初始值就跳过,防止int超出范围。

  1. 举例推导dp数组
class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int i = 0; i < coins.size(); i++) { // 遍历物品for (int j = coins[i]; j <= amount; j++) { // 遍历背包if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过dp[j] = min(dp[j - coins[i]] + 1, dp[j]);}}}if (dp[amount] == INT_MAX) return -1;return dp[amount];}
};

总结:

  • 防止越界,还有min操作,关键。

LeetCode 279- 完全平方数

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

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

解题思路

  1. 确定dp数组(dp table)以及下标的含义

dp[j] 表示:凑成数字j,最少需要多少个数。

  1. 确定递推公式

dp[i] = min(dp[i - j * j] + 1, dp[i]);我们只需要找每个平方数来进行凑合

  1. dp数组如何初始化

dp[0] = 0,由于我们要取最小数,所以其余全部初始化为INT_MAX

  1. 确定遍历顺序

数字正序遍历,背包容量正序遍历

  1. 举例推导dp数组
class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX);dp[0] = 0;for (int i = 0; i <= n; i++) { // 遍历背包for (int j = 1; j * j <= i; j++) { // 遍历物品dp[i] = min(dp[i - j * j] + 1, dp[i]);}}return dp[n];}
};

总结:

  • 和上题一样的

http://www.ppmy.cn/news/1035597.html

相关文章

分块 莫队

CF940F Machine Learning 莫队维护区间每个数字出现的次数&#xff0c;维护某个出现次数是否出现过&#xff0c;暴力枚举mex即可&#xff0c;易证每次枚举最多 n \sqrt n n ​次 CF375D Tree and Queries 树转链&#xff0c;莫队维护区间每个颜色出现的次数&#xff0c;如果再…

C# 随心记

#region 批量保存到数据库 public bool InsertDB(DataTable dt) { bool bResult true; LogInfo.WriteTextToFile("使用Bulk插入的实现方式"); Stopwatch sw new Stopwatch(); using (SqlConnecti…

Centos下的tcpdump抓包用法

先查一下是否安装, 无的话装一下 (版本低的用yum install) : rpm -qa tcpdump dnf install tcpdump 1. 列出能抓包的网卡: tcpdump -D | --list-interfaces 2. 在eth0网卡上抓来源为10.1.1.1 的包, 只抓一个包 (-n这里是不解析DNS) : tcpdump -i eth0 -n src 10.1.1.1 -…

机器学习算法之-逻辑回归(2)

为什么需要逻辑回归 拟合效果太好 特征与标签之间的线性关系极强的数据&#xff0c;比如金融领域中的 信用卡欺诈&#xff0c;评分卡制作&#xff0c;电商中的营销预测等等相关的数据&#xff0c;都是逻辑回归的强项。虽然现在有了梯度提升树GDBT&#xff0c;比逻辑回归效果更…

关于flink-sql-connector-phoenix的重写逻辑

目录 重写意义 代码结构 调用链路 POM文件配置 代码解析 一、PhoenixJdbcDynamicTableFactory

神经网络基础-神经网络补充概念-07-使用计算图求导

步骤 定义计算节点和操作&#xff1a; “x” 是输入变量。 “Add” 表示加法操作。 “Sub” 表示减法操作。 “Multiply” 表示乘法操作。 计算函数值&#xff1a; 首先&#xff0c;我们将 x0 的值代入计算图中&#xff0c;计算出函数的值。 反向传播计算导数&#xff1a; 我…

【Visual Studio Code】--- Win11 配置 VS Code 为中文 超详细

Win11 配置 VS Code 为中文 超详细 一、概述二、重要提示二、配置 VS Code 为中文 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 二、重要提示…

Python基础知识:列表推导式详解

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们经常需要这样处理一个列表&#xff1a; 把一个列表里面的每个元素&#xff0c; 经过相同的处理 &#xff0c;生成另一个列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方…