LeetCode刷题day29——动态规划(完全背包)

LeetCode刷题day29——动态规划(完全背包)

    • 377. 组合总和 Ⅳ
      • 分析:
    • 57. 爬楼梯(第八期模拟笔试)
            • 题目描述
            • 输入描述
            • 输出描述
            • 输入示例
            • 输出示例
            • 提示信息
      • 分析:
    • 322. 零钱兑换
      • 分析:
    • 279. 完全平方数
      • 分析:
    • 139. 单词拆分
      • 分析:

377. 组合总和 Ⅳ

https://leetcode.cn/problems/combination-sum-iv/

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

**进阶:**如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?

分析:

注意这里的溢出报错:dp[i] + dp[i - nums[j]]不能被表示,会直接报错

 // if (i - nums[j] >= 0 && dp[i] + dp[i - nums[j]] <// INT_MAX) overflow: 2147483646 + 1073741824 cannot be// represented in type 'value_type' (aka 'int')// (solution.cpp)
  • 如果先物品后容量,是排列(上一题
  • 先容量后物品,是组合(讲顺序

如果把遍历 nums(物品)放在外层循环,target 放在内层循环,举个例子:计算 dp[4] 时,结果集只会包含 {1, 3} 这样的组合,而不会有 {3, 1},因为外层循环的 nums 顺序固定,3 必须在 1 后面。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target + 1, 0);dp[0] = 1;// 如果先物品后容量,是排列// 先容量后物品,是组合(讲顺序for (int i = 0; i <= target; i++) {         // 容量for (int j = 0; j < nums.size(); j++) { // 物品if (i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]])// if (i - nums[j] >= 0 && dp[i] + dp[i - nums[j]] <// INT_MAX) overflow: 2147483646 + 1073741824 cannot be// represented in type 'value_type' (aka 'int')// (solution.cpp)dp[i] = dp[i] + dp[i - nums[j]];}}return dp[target];}
};

57. 爬楼梯(第八期模拟笔试)

https://kamacoder.com/problempage.php?pid=1067

题目描述

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

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

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

输入描述

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

输出描述

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

输入示例
3 2
输出示例
3
提示信息

数据范围:
1 <= m < n <= 32;

当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。

此时你有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶段
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

分析:

楼梯总阶数n作为容量,from 0 to n(列)

至多能爬m阶作为物品,from 1 to m(行)

  • 动态规划方程: dp[i] = dp[i] + d[i-v[i]];

求组合,所以先遍历容量,而且动态规划方程是跟着容量一起变化的

int main() {int n, m;cin >> n >> m;vector<int> v(m);for (int i = 0; i < m; i++)v[i] = i + 1;vector<int> dp(n + 1, 0);dp[0] = 1;for (int i = 0; i <= n; i++) {for (int j = 0; j < m; j++) {if (i - v[j] >= 0)dp[i] += dp[i - v[j]];//注意,这里是外层的下标}}cout << dp[n] << endl;return 0;
}

322. 零钱兑换

https://leetcode.cn/problems/coin-change/

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

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

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

示例 1:

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

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

分析:

示例1的填表过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 动态规划方程: dp[j] = min(1 + dp[j - coins[i]], dp[j]);

​ 本硬币i加入 不加入这块硬币

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX - 1);dp[0] = 0;for (int j = 0; j <= amount; j++)for (int i = 0; i < coins.size(); i++) {if (j >= coins[i])dp[j] = min(1 + dp[j - coins[i]], dp[j]);}if (dp[amount] == INT_MAX - 1)return -1;return dp[amount];}
};

279. 完全平方数

https://leetcode.cn/problems/perfect-squares/)

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

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

示例 1:

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

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

分析:

没什么好分析的,前面的会了,这题秒。

class Solution {
public:int numSquares(int n) {int num = ceil(sqrt(n));vector<int> dp(n + 1, INT_MAX - 1);vector<int> nums(num, 0);for (int i = 0; i < num; i++)nums[i] = (i + 1) * (i + 1);dp[0] = 0;for (int i = 0; i <= n; i++) {for (int j = 0; j < num; j++) {if (i >= nums[j])dp[i] = min(dp[i - nums[j]] + 1, dp[i]);}}return dp[n];}
};

139. 单词拆分

https://leetcode.cn/problems/word-break/)

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • swordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

分析:

该算法使用 动态规划 来判断给定的字符串 s 是否可以被分割为若干个字典中的单词。

  1. 动态规划数组 dp
    • 定义一个布尔型数组 dp,其中 dp[i] 表示字符串 s[0...i-1] 是否可以由字典中的单词组成。
    • 初始化 dp[0] = true,表示空字符串可以被分割。
  2. 状态转移
    • 遍历字符串 s 的每个位置 i,如果 dp[i]true(即 s[0...i-1] 可以被分割),则继续向后查找可能的子字符串 s[i...j-1],并判断该子字符串是否存在于字典中。
    • 如果存在该单词,则将 dp[j] 设置为 true,表示 s[0...j-1] 可以由字典中的单词组成。
  3. 返回结果
    • 最终,dp[len] 表示整个字符串 s 是否可以由字典中的单词组成,返回 dp[len] 即可。
  • 也就是说:如果 dp[j]trues[j, i] 在字典中,则 dp[i] = true。其中,j < i
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {int len = s.size();vector<bool> dp(len + 1, false);dp[0] = true;for (int i = 0; i <= len; i++) {if (dp[i]) {for (int j = i + 1; j <= len; j++) {string word = s.substr(i, j - i);int flag = 0;for (int k = 0; k < wordDict.size(); k++) {if (wordDict[k] == word) {flag = 1;break;}}if (flag == 1)dp[j] = true;}}}return dp[len];}
};

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

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

相关文章

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车&#xff0c;以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析&#xff0c;具有良好的实用性和推广价值。 系统组成 系统主要由P…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

windows 自旋锁的实现

VOID KxAcquireSpinLock ( __inout PKSPIN_LOCK SpinLock) {//设置SpinLock指定位,并返回原值//如果原值为0,表示没有上锁,直接返回//如果原值为1,表示已经上锁,进入函数if (InterlockedBitTestAndSet64((LONG64 *)SpinLock, 0)){KxWaitForSpinLockAndAcquire(SpinLock);}retur…

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言 前序学习进程中&#xff0c;我们已经掌握了对HSV通道和BGR通道的拆分和合并&#xff0c;并通过自由组合的形式&#xff0c;获得了和初始图像完全不一样的新图像&#xff0c;相关文章可以参考下述链接&#xff1a; python学opencv|读取图像&#xff08;十四&#xf…

【进阶编程】MVC和MVVM实现前后端分离的实现

在 WPF 开发中&#xff0c;通常使用 MVVM&#xff08;Model-View-ViewModel&#xff09;架构来分离视图和业务逻辑&#xff0c;但在某些情况下&#xff0c;你可能希望将 MVC&#xff08;Model-View-Controller&#xff09;模式与 MVVM 结合使用。这种结合有时是为了兼顾不同的架…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作&#xff0c;我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置&#xff0c;我们将完成 CEF 的构建工作&#xff0c;最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

网络安全技术深度解析与实践案例

网络安全技术深度解析与实践案例 随着信息技术的飞速发展&#xff0c;计算机网络已经成为现代社会不可或缺的一部分。无论是个人生活、企业运营还是国家安全&#xff0c;网络都扮演着至关重要的角色。然而&#xff0c;网络空间的开放性和匿名性也带来了诸多安全隐患。因此&…

[一招过] Python的正则表达式篇

Python 正则表达式&#xff08;re模块&#xff09; 正则表达式&#xff08;regular expression&#xff09;是用于匹配字符串的一种强大工具。Python 提供了 re 模块来处理正则表达式。通过正则表达式&#xff0c;可以快速匹配、查找、替换、分割字符串等。 1. re 模块基础 …

Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器

目录 1. 本地安装 Zerotier2. 使用本地CMD或者Xshell连接服务器&#xff1a;3. VSCode连接服务器 1. 本地安装 Zerotier Zerotier用来创建一个虚拟网络&#xff0c;可以将服务器和本机都加入该虚拟网络中。本地将会拥有一个内网ip地址&#xff0c;和服务器在一个网络下&#x…

gcd 生成4d

目录 推理示例: 开源地址 https://github.com/basilevh/gcd 推理示例: This section is for casually running our model on custom videos. For thorough quantitative evaluation on Kubric-4D or ParallelDomain-4D, or any command line inference outside of those t…

网安入门|前端基础之Html_css基础

Web1.0、Web2.0 和 Web3.0 是互联网发展的三个主要阶段&#xff0c;每个阶段有其独特的特征和技术进步。以下是对它们的介绍&#xff1a; Web 1.0&#xff08;静态互联网&#xff09; 时间&#xff1a;1990年代初到2000年代初 特点&#xff1a; 静态内容&#xff1a;网页主要…

开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品

文章目录 引言I 技术架构和业务流程技术架构北斗终端信息流II 渠道接口验证签名白名单IP渠道配置表设计III 其他辅助功能TCP 发送消息到消息中心nginx转发网关服务异常捕获日志采集IV 知识扩展对请求参数进行校验引言 开发平台的应用场景:平台需要开发能力给下游平台需要接收上…

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…

C语言中回调函数的注册及使用

1&#xff0c;回调函数类型定义 #include <stdio.h>// 定义回调函数类型 typedef void (*CallbackFunction)(int); 2&#xff0c;定义注册和调用回调函数的函数 // 存储回调函数的数组 CallbackFunction callbacks[10]; int callback_count 0;// 注册回调函数 void r…

SQL Server 解决游标性能问题的替代方案

在 SQL Server 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于逐行处理数据集的强大工具&#xff0c;但在某些情况下&#xff0c;它们可能会导致性能问题&#xff0c;尤其是在处理大量数据时。为了提高性能和可维护性&#xff0c;可以考虑使用其他替代方案。以下…

Vue3路由跳转动画引发页面抖动问题的解决方案

在现代Web应用中&#xff0c;动画不仅提升了视觉效果&#xff0c;还显著改善了用户体验。Vue3作为前端框架的佼佼者&#xff0c;以其强大的生态和灵活的API为开发者提供了丰富的动画实现方式。然而&#xff0c;在Vue3中为路由跳转增加动画效果时&#xff0c;开发者可能会遇到页…

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…