当前位置: 首页 > news >正文

算法刷题day33|动态规划:322. 零钱兑换、279. 完全平方数、139. 单词拆分

322. 零钱兑换

1.dp数组以及下标的含义:dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

 2.递推公式:凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j]

dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

3.初始化:首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;

考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。

所以下标非0的元素都是应该是最大值。

4.遍历顺序:本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。所以本题并不强调集合是组合还是排列。

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

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];}
};

279. 完全平方数

思路和零钱兑换一样,但是要注重代码的细节

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];}
};

139. 单词拆分

回溯

使用memory数组保存每次计算的以startIndex起始的计算结果,如果memory[startIndex]里已经被赋值了,直接用memory[startIndex]的结果。

class Solution {
private:bool backtracking (const string& s,const unordered_set<string>& wordSet,vector<bool>& memory,int startIndex) {if (startIndex >= s.size()) {return true;}// 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果if (!memory[startIndex]) return memory[startIndex];for (int i = startIndex; i < s.size(); i++) {string word = s.substr(startIndex, i - startIndex + 1);if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, memory, i + 1)) {return true;}}memory[startIndex] = false; // 记录以startIndex开始的子串是不可以被拆分的return false;}
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> memory(s.size(), 1); // -1 表示初始化状态return backtracking(s, wordSet, memory, 0);}
};

动态规划

1.dp数组以及下标的含义:dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词

2.递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

3.初始化:dp[0]一定要为true,否则递推下去后面都都是false了。 

4.遍历顺序:本题其实我们求的是排列数,本题一定是 先遍历 背包,再遍历物品。

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);dp[0] = true;for (int i = 1; i <= s.size(); i++) {   // 遍历背包for (int j = 0; j < i; j++) {       // 遍历物品string word = s.substr(j, i - j); //substr(起始位置,截取的个数)if (wordSet.find(word) != wordSet.end() && dp[j]) {dp[i] = true;}}}return dp[s.size()];}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MySQL 核心】MySQL数据恢复-dbsake
  • 工厂模式和策略模式的区别以及使用
  • LLM 学习之「向量数据库」
  • FreeSWITCH
  • ZLMediaKit如何结合webrtc实现双向对讲
  • 【MySQL】2.MySQL实际操作
  • [C#数据加密]——MD5、SHA、AES、RSA
  • Chainlit快速实现AI对话应用将聊天数据的持久化到Mongo非关系数据库中
  • CI/CD——CI持续集成实验
  • 解决No module named ‘tensorflow‘
  • linux共有云主机ssh升级(以openEuler22.03为例)
  • 高级java每日一道面试题-2024年8月12日-设计模式篇-请列举出在JDK中几个常用的设计模式?
  • Web Vitals:提升用户体验的关键指标
  • VR虚拟展厅与传统实体展厅相比,有哪些优势?
  • PostgreSQL 练习 ---- psql 新增连接参数
  • 78. Subsets
  • Angular数据绑定机制
  • Elasticsearch 参考指南(升级前重新索引)
  • Fastjson的基本使用方法大全
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JDK 6和JDK 7中的substring()方法
  • js正则,这点儿就够用了
  • Lucene解析 - 基本概念
  • markdown编辑器简评
  • php面试题 汇集2
  • php中curl和soap方式请求服务超时问题
  • Rancher如何对接Ceph-RBD块存储
  • 订阅Forge Viewer所有的事件
  • 今年的LC3大会没了?
  • 每天10道Java面试题,跟我走,offer有!
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信小程序开发问题汇总
  • ###项目技术发展史
  • #android不同版本废弃api,新api。
  • (1)Nginx简介和安装教程
  • (20050108)又读《平凡的世界》
  • (3)STL算法之搜索
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (poj1.3.2)1791(构造法模拟)
  • (Python第六天)文件处理
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (黑马C++)L06 重载与继承
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)Linux Shell编程——输入输出重定向
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)树状数组
  • **PHP二维数组遍历时同时赋值
  • *Django中的Ajax 纯js的书写样式1
  • ../depcomp: line 571: exec: g++: not found