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

代码随想录算法训练营第46天 | 完全背包,139.单词拆分

动态规划章节理论基础:

https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

完全背包理论基础:

https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html

139.单词拆分

题目链接:https://leetcode.cn/problems/word-break/

思路:

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

动规五部曲:
(1)确定dp数组以及下标含义
dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。

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

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

(3)dp数组初始化
从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。

那么dp[0]有没有意义呢?

dp[0]表示如果字符串为空的话,说明出现在字典里。

但题目中说了“给定一个非空字符串 s” 所以测试数据中不会出现i为0的情况,那么dp[0]初始为true完全就是为了推导公式。

(4)确定遍历顺序
而本题其实我们求的是排列数,为什么呢。 拿 s = “applepenapple”, wordDict = [“apple”, “pen”] 举例。

“apple”, “pen” 是物品,那么我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。

“apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。

所以说,本题一定是 先遍历 背包,再遍历物品。

(5)举例推导dp数组
以输入: s = “leetcode”, wordDict = [“leet”, “code”]为例,dp状态如图:
在这里插入图片描述
dp[s.size()]就是最终结果。

代码:

class Solution {public int change(int amount, int[] coins) {int len = coins.length;int[]dp = new int[amount+1];dp[0] = 1;for(int i=0; i< len;i++){for(int j=coins[i];j<= amount;j++){// dp[j] = Math.max(dp[j],dp[j-coins[i]]+1);// 装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];// 和494.目标和这道题的递推公式是一样的dp[j] = dp[j] + dp[j-coins[i]];}}return dp[amount];}
}
http://www.lryc.cn/news/320889.html

相关文章:

  • rust - 将windows剪贴板的截图保存为png
  • pyflink1.18.0 报错 TypeError: cannot pickle ‘_thread.lock‘ object
  • 算法学习系列(四十一):Flood Fill算法
  • Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners
  • stm32-编码器测速
  • 全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库
  • 【LAMMPS学习】二、LAMMPS安装(2)MacOS和Win安装
  • 如何解决网络中IP地址发生冲突故障?
  • 机器学习常用框架
  • 计算机网络——物理层(信道复用技术)
  • 【Qt问题】使用QSlider创建滑块小部件无法显示
  • Linux--Shell脚本安装 httpd 和 修改IP
  • mysql 常见问题
  • 考研机试题
  • Java基础知识总结(6)
  • JAVA基础—关于Java的反射机制
  • Hive中的explode函数、posexplode函数与later view函数
  • 北京市委统战部领导一行莅临百望云视察调研
  • 使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】
  • How to manage Python environment based on virtualenv in Ubuntu 22.04
  • 一款基于 SpringCloud 开发的AI聊天机器人系统,已对接GPT-4.0,非常强大
  • C语言自定义库
  • 目标检测常见数据集格式(YOLO、VOC、COCO)
  • 搭建 es 集群
  • Android弹出通知
  • 如何用 UDP 实现可靠传输?并以LabVIEW为例进行说明
  • 【任职资格】某大型商业金融银行任职资格体系搭建项目纪实
  • 如何利用IP地址分析风险和保障网络安全
  • 轧钢自动化中的智能仪器:监控、控制和优化新视角
  • 第十四届蓝桥杯省赛C++B组题解