代码随想录算法训练营第三十六天|Day36 动态规划

1049. 最后一块石头的重量 II

视频讲解:https://www.bilibili.com/video/BV14M411C7oV

https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html

思路

#define MAX(a, b) (((a) > (b)) ? (a) : (b))
int getSum(int *stones, int stoneSize) {int sum = 0, i;for (i = 0; i < stoneSize; ++i)sum += stones[i];return sum;
}
int lastStoneWeightII(int* stones, int stonesSize){int sum = getSum(stones, stonesSize);int target = sum / 2;int i, j;int *dp = (int*)malloc(sizeof(int) * (target + 1));memset(dp, 0, sizeof(int) * (target + 1));for (j = stones[0]; j <= target; ++j)dp[j] = stones[0];for (i = 1; i < stonesSize; ++i) {for (j = target; j >= stones[i]; --j)dp[j] = MAX(dp[j], dp[j - stones[i]] + stones[i]);}return sum - dp[target] - dp[target];
}

学习反思

实现了解决最后一块石头的重量问题。代码的主要思路是使用动态规划来计算最大重量的一半,然后用总重量减去最大重量的一半的两倍。首先,定义了一个宏函数MAX,用来取两个数中的最大值。接下来,定义了一个函数getSum,用来计算数组stones中所有元素的和。然后,在lastStoneWeightII函数中,首先计算了数组stones的总和sum,并计算了最大重量的一半target。接下来,使用动态规划的思想,创建了一个大小为target+1的dp数组,并将其初始化为0。然后,从数组stones的第一个元素开始,遍历数组stones,对于每个元素,从target向stones[i]遍历dp数组,并更新dp[j]的值为当前元素stones[i]的重量和dp[j-stones[i]]的值之和的最大值。最后,返回sum - dp[target] - dp[target],即总重量减去最大重量的一半的两倍。时间复杂度为O(stonesSize * target),空间复杂度为O(target)。

494. 目标和

视频讲解:https://www.bilibili.com/video/BV1o8411j73x

https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html

思路

int getSum(int * nums, int numsSize){int sum = 0;for(int i = 0; i < numsSize; i++){sum += nums[i];}return sum;
}
int findTargetSumWays(int* nums, int numsSize, int target) {int sum = getSum(nums, numsSize);int diff = sum - target;if(diff < 0 || diff % 2 != 0){return 0;}int bagSize = diff / 2;int dp[numsSize + 1][bagSize + 1];dp[0][0] = 1;for(int i = 1; i <= numsSize; i++){int num = nums[i - 1];for(int j = 0; j <= bagSize; j++){dp[i][j] = dp[i - 1][j];if(j >= num){dp[i][j] += dp[i - 1][j - num];}}}return dp[numsSize][bagSize];
}

学习反思

实现了解决目标和问题。目标和问题是给定一个非负整数数组和一个目标整数,要求从数组中选择一些元素,使得它们的和等于目标整数。这段代码使用动态规划的思想来解决该问题。首先,定义了一个函数getSum,用来计算数组nums中所有元素的和。然后,在findTargetSumWays函数中,首先计算了数组nums的总和sum,并计算了数组元素和目标整数之差diff。如果diff小于0或diff不是偶数,即无法找到满足条件的解,返回0。接下来,计算容量为diff / 2的背包的最大容量bagSize。然后,创建了一个大小为numsSize + 1行、bagSize + 1列的dp数组,并将dp[0][0]初始化为1,表示当没有元素和背包容量为0时,有一种选择方式。然后,使用二维动态规划的思想,遍历数组nums,并在每个位置(i, j)上计算选择前i个元素,使得和为j的方案数。对于当前位置(i, j),如果当前元素nums[i-1]小于等于背包容量j,意味着可以选择当前元素,那么dp[i][j]的值为上一行的dp[i-1][j]加上上一行的dp[i-1][j-nums[i-1]](即选择当前元素后背包容量减少了nums[i-1])的值。最后,返回dp[numsSize][bagSize],即选择前numsSize个元素,使得和为bagSize的方案数。时间复杂度为O(numsSize * bagSize),空间复杂度为O(numsSize * bagSize)。

474.一和零

视频讲解:https://www.bilibili.com/video/BV1rW4y1x7ZQ

https://programmercarl.com/0474.%E4%B8%80%E5%92%8C%E9%9B%B6.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int findMaxForm(char** strs, int strsSize, int m, int n) {int dp[m + 1][n + 1];memset(dp, 0, sizeof (int ) * (m + 1) * (n + 1));for(int i = 0; i < strsSize; i++){// 统计0和1的数量int count0 = 0;int count1 = 0;char *str = strs[i];while (*str != '\0'){if(*str == '0'){count0++;} else{count1++;}str++;}for(int j = m; j >= count0; j--){for(int k = n; k >= count1; k--){dp[j][k] = max(dp[j][k], dp[j - count0][k - count1] + 1);}}}return dp[m][n];
}

学习反思

实现了解决0-1背包问题的一种变种,即找到最大能够由给定字符串数组中的元素组成的字符串数量,其中每个字符串的0和1的数量不超过给定的m和n。首先,定义了一个宏函数max用来取两个数的最大值。然后,在findMaxForm函数中,创建了一个大小为(m + 1) * (n + 1)的二维数组dp,并将其初始化为0。接下来,对于给定的字符串数组中的每个字符串,统计其0和1的数量。然后,使用二维动态规划的思想,从m和n开始递减遍历,表示剩余的0和1的数量。对于当前剩余的0和1的数量(j, k),dp[j][k]表示能够由前i个字符串组成的字符串数量。如果当前字符串的0和1的数量(count0, count1)小于等于剩余的0和1的数量(j, k),则表示可以选择当前字符串,那么dp[j][k]的值为上一行的dp[j][k]和上一行的dp[j - count0][k - count1] + 1(即选择当前字符串后剩余的0和1的数量减少了count0和count1)的最大值。最后,返回dp[m][n],即能够由给定字符串数组中的元素组成的最大字符串数量。时间复杂度为O(strsSize * m * n),空间复杂度为O(m * n)。

总结

动态规划,加油!!!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Sibyl:提升复杂现实世界推理能力的LLM智能体框架

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;以其卓越的问题解决能力而闻名&#xff0c;这主要归功于它们内在的知识储备、强大的上下文学习能力以及零样本&#xff08;zero-shot&#xff09;能力。然而&#xff0c;这些基于LLM的智能体在长期推…

Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南

开源代码&#xff1a;将工具库迁移到GitHub 随着项目的成熟和完善&#xff0c;将其开源不仅可以获得更多的用户和贡献者&#xff0c;还能促进项目本身的发展。GitHub作为全球最大的开源协作平台&#xff0c;自然成为了大多数开发者的首选。本文将引导您完成将工具库迁移至GitH…

ai面试辅助工具有哪些

目前市场上常见的AI面试辅助工具包括以下几款‌&#xff1a; ‌白瓜面试‌&#xff1a;这是一款专为在线面试和笔试场景设计的AI助手&#xff0c;支持实时语音识别、图片识别、智能辅助回答等功能&#xff0c;适用于多种岗位和面试平台‌ ‌Interview‌&#xff1a;这是一款基…

Redis - Zset 有序集合

一、基本认识 有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数&#xff08;score&#xff09;与之关 联&#xff0c;着使得有序集合中…

Linux下的WatchDog

看门狗&#x1f415; 看门狗简介 看门狗定时器&#xff08;Watchdog Timer&#xff09;是一种定时器&#xff0c;用于检测系统是否正常运行。如果系统在规定时间内没有向看门狗定时器发送复位信号&#xff0c;看门狗定时器就会产生复位信号&#xff0c;使系统复位。看门狗定时…

vue3+vite搭建脚手架项目本地运行electron桌面应用

1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 2.创建完项目后&#xff0c;安装所需依赖包 npm i vite-plugin-electron electron26.1.0 3.根目录下创建electron/main.ts electron/main.ts /** electron/main.ts */import { app, BrowserWindow } from "electron&qu…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

H7-TOOL的LUA小程序教程第17期:扩展驱动AD7606, ADS1256,MCP3421, 8路继电器和5路DS18B20(2024-11-01)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

为开源 AI 模型引入激励机制?解读加密 AI 协议 Sentient 的大模型代币化解决方案

撰文&#xff1a;Shlok Khemani 编译&#xff1a;Glendon&#xff0c;Techub News 古时候&#xff0c;中国人深信「阴阳」的概念——宇宙的每一个方面都蕴含着内在的二元性&#xff0c;这两种相反的力量不断地相互联系&#xff0c;形成一个统一的整体。就好比女性代表「阴」&a…

ONES 功能上新|ONES Project 甘特图全面升级

ONES Project 甘特图全面升级&#xff0c;提供更加专业、灵活的工具。 项目经理往往面临项目进度难以直观把控、关键任务容易遗漏、里程碑节点缺乏明确标记、进度偏差无法及时发现等挑战。 针对这些痛点&#xff0c;ONES 新增了关键路径、基线对比、里程碑视图、交付物视图等 1…

windows 进程降权和提权代码示例(2) c++

强制完整性控制 - Win32 应用程序 |Microsoft 学习 一、强制完整性控制 品03/26/20217 个参与者 反馈 本文内容 诚信标签进程创建强制性政策 强制完整性控制 &#xff08;MIC&#xff09; 提供了一种用于控制对安全对象的访问的机制。此机制是对自主访问控制的补充&#xff…

基于Python的旅游景点推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【C++】vector 类深度解析:探索动态数组的奥秘

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 如果你对string类还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; &#x1f449;【C】string 类深度解析&#xff1a;…

Hugging Face 平台轻松上手 | 书生大模型

文章目录 HF 的 Transformers 库GitHub CodeSpace 使用终端安装依赖下载 internlm2_5-7b-chat 的配置文件 参考文献 HF 的 Transformers 库 直接使用预训练模型进行推理提供了大量预训练模型可供使用使用预训练模型进行迁移学习 因此在使用 HF 前&#xff0c;我们需要下载 Tra…

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

如何开发查找附近地点的微信小程序

我开发的是找附近卫生间的小程序。 在现代城市生活中&#xff0c;找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题&#xff0c;我们可以开发一款微信小程序&#xff0c;帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序&#xff0c;包…

canfestival主站多电机对象字典配置

不要使用数组进行命名&#xff1a;无法运行PDO 使用各自命名的方式&#xff1a;

楼宇智慧公厕为用户提供清晰厕位引导,提高用厕效率

如今楼宇管理者越来越重视公共设施的优化&#xff0c;尤其是公厕的管理。楼宇智慧公厕系统通过先进的技术&#xff0c;为用户提供清晰的厕位引导&#xff0c;显著提高了用厕效率。本文将从两个方面介绍楼宇智慧公厕系统的功能及其带来的好处。 一、清晰厕位引导 楼宇智慧公厕系…

Ubuntu 20.04 安装 QGC v4.3 开发环境

Ubuntu 20.04 安装 QGC开发环境 1. 准备安装 Qt 5.15.2安装依赖获取源码 2. 编译参考 前言 QGC ( QGroundControl) 是一个开源地面站&#xff0c;基于QT开发的&#xff0c;有跨平台的功能。可以在Windows&#xff0c;Android&#xff0c;MacOS或Linux上运行。它可以将PX4固件加…