代码随想录 Day39 动态规划 LeetCode T139 单词拆分 动规总结篇1

前言

在本期开始之前,让我们再回顾一下动规五部曲,并且今天的任务只有一道题,我们顺便也回顾一下之前学过的知识点,动规的前面集中化题型,0-1背包,完全背包,以及很多种遍历顺序,让秋秋和大家娓娓道来.

首先我们回顾一下动态规划的动规五部曲.

1.明确dp数组的元素含义

2.明确dp数组的递推公式

3.初始化dp数组

4.明确dp数组的遍历方式

5.打印dp数组排错逻辑

前面文章回顾:

代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗-CSDN博客

代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II-CSDN博客

代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集-CSDN博客

代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零-CSDN博客

代码随想录 Day37 完全背包理论基础 卡码网T52 LeetCode T518 零钱兑换II T377 组合总和IV-CSDN博客

代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数-CSDN博客

LeetCode T139 单词划分

题目链接:139. 单词拆分 - 力扣(LeetCode)

题目思路:

本题最简单的思路肯定是回溯算法去暴力枚举每一种结果,我们可以回顾一下之前的回溯算法

算法的复杂度是O(2^n),因为每一个元素只有两种结果,选或者不选,当然这道题不是我们今天的主菜,下面我会给出可以ac的回溯算法的代码,但是今天我们还是着重讨论动规算法的解法

1.明确dp数组的元素含义

dp[i] 的意义是dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词

2.明确dp数组的递推公式

递推公式就是当[j,i]这个字符串出现在字典里,并且dp[j]是true,那么就设置为dp[i]为true

3.初始化dp数组

dp[0] = true;其他的赋值为false

4.明确dp数组的遍历方式

先遍历背包后遍历物品,理由在拓展中,用用例举例,假如第一个apple写入了一个true,第二个元素pen并不能将最后一个元素赋值为true,除非再给一个apple来遍历才行

5.打印dp数组排错逻辑

题目代码:

//动规算法的解法
class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp = new boolean[s.length()+1];//初始化Arrays.fill(dp,false);dp[0] = true;//遍历for(int i = 1;i<=s.length();i++){for(String word:wordDict){int len = word.length();if(i>=len && dp[i-len] == true && word.equals(s.substring(i-len,i)) ){dp[i] = true;}}}return dp[s.length()];}
}//回溯算法的解法class Solution {private Set<String> set;private int[] memo;public boolean wordBreak(String s, List<String> wordDict) {memo = new int[s.length()];set = new HashSet<>(wordDict);return backtracking(s, 0);}public boolean backtracking(String s, int startIndex) {// System.out.println(startIndex);if (startIndex == s.length()) {return true;}if (memo[startIndex] == -1) {return false;}for (int i = startIndex; i < s.length(); i++) {String sub = s.substring(startIndex, i + 1);// 拆分出来的单词无法匹配if (!set.contains(sub)) {continue;                }boolean res = backtracking(s, i + 1);if (res) return true;}// 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到memo[startIndex] = -1;return false;}
}

拓展:

 这里我们也谈一下为什么不能先遍历物品,后遍历背包不行?

因为这里我们先想一想之前遍历背包再遍历物品先遍历物品在再遍历背包 分别对应了什么问题的解决

先物品后背包    ---------------      组合问题,不讲究顺序

先背包后数组    ---------------      排列问题,讲究顺序

使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下:

最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。

除非是先用 "apple" 遍历一遍,再用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。

总结动规问题1

普通动规问题

斐波那契数   

递推公式:dp[i] = dp[i-1]+dp[i-2];

爬楼梯

递推公式:dp[i] = dp[i-1]+dp[i-2];

最小花费爬楼梯

这里比上面多了一个价值和求最小值

dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);

不同路径

dp[i][j] = dp[i-1][j] + dp[i][j-1]; 结果从左边和上面产生

不同路径II(加上阻碍)

dp[i][j] = (obstacleGrid[i][j] == 0)?dp[i-1][j] + dp[i][j-1]:0;遇到阻碍标记成0

整数拆分

dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])) 拆分成两个或多个

不同的搜索二叉树

这时候dp[i]表示j个节点有多少个不同的二叉搜索树

dp[i] += dp[j-1] * dp[i-j];

注:左子树节点数*右子树

0-1背包(一维数组遍历背包是从大到小,避免每个物品取了多次)

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

重要的公式说三遍

分割等和子集

求和除以2当做背包容量

查看能否装满

dp[j]表示放进物品时,最大容量

dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);

最后一块石头的重量II

和上面一样分两半处理,最后用sum减去中间值dp的两倍即可

dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[j])

目标和(此时就在原来的基础上变成了方法有多少种)

求正1的数量和-1的都可以,通过推导得到公式

left = (target+sum)/2   正的阵营

dp += dp[j-nums[i]]

一和零

用一维数组从两个维度思考问题,价值是有x和y两个维度

和前面一样倒序遍历不过从两个维度出发

for (int i = m; i >= zeroNum; i--) {for (int j = n; j >= oneNum; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}

完全背包(在0-1背包上遍历背包改成从前向后)

零钱兑换II

求组合数

求方法数dp[j]+=dp[j-coins[i]];

组合总和IV

求排列数,先背包后物品

爬楼梯(进阶)

累加即可,排列数

零钱兑换

由于求最小值,所以赋值为最大数,如果dp[j-coins[i]]没变就代表这个数没意义

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

完全平方数

最小的装满同上思路,不过这题不是隔着修改,无需判断是否有效

单词拆分

这题一定要用背包遍历物品,原因在上面

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

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

相关文章

10.(vue3.x+vite)组件间通信方式之props与$emit

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 父组件代码 <template><div><div>{{message }}</div><Child

在校园跑腿系统小程序中,如何设计高效的实时通知与消息推送系统?

1. 选择合适的消息推送服务 在校园跑腿系统小程序中&#xff0c;选择一个适合的消息推送服务。例如&#xff0c;使用WebSocket技术、Firebase Cloud Messaging (FCM)、或第三方推送服务如Pusher或OneSignal等。注册并获取相关的API密钥或访问令牌。 2. 集成服务到小程序后端…

Docker配置Nginx反向代理

文章目录 1.部署微程序到docker中1.1 dockerfile文件1.2 依据自定义的dockerfile文件创建docker镜像1.3 创建容器1.4 测试 2.在docker中安装Nginx2.1 安装Nginx镜像2.2 获取Nginx配置文件并将其同步到宿主电脑指定位置中安装nginx容器删除nginx容器 2.3 安装Nginx容器并数据挂载…

CN考研真题知识点二轮归纳(5)

本轮的最后一贴&#xff0c;真题中涉及计网的部分彻底总结完&#xff01;后期的3轮总结可能会上一些大题&#xff0c;比如路由转发、子网划分什么的&#xff0c;以及重点的背诵内容~ 上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;4&#xff09;https://jslhyh32…

Android耗电量测试

背 / 景 / 介 / 绍 目前对于移动设备而言&#xff0c;电量是很重要的一个方面。现在大家使用手机基本每天都需要充电&#xff0c;所以用户也非常关注耗电的问题&#xff0c;如果应用设计不合理导致电量大量消耗&#xff0c;那么对于关注耗电的用户而言&#xff0c;这款应用将会…

谷歌浏览器配置允许跨域

1、在谷歌浏览器导航栏搜索chrome://flags 2、搜索Block insecure private network requests 3、修改状态

10 路由协议:西出网关无故人,敢问路在何方

1.网络包出了网关之后&#xff0c;就有了一种漂泊的悲凉感 2.之前的场景是比较简单的场景&#xff0c;但是在实际生产环境下&#xff0c;出了网关&#xff0c;会面临着很多路由器&#xff0c;有很多条道路可以选。 3、如何配置路由&#xff1f; 路由表的设计 1.路由器就是一…

【计算文献解读】ACS Catal.:塑料垃圾回收利用中的均相催化

合理的塑料回收对于解决与塑料垃圾相关的环境挑战至关重要&#xff0c;而在各种回收方法中&#xff0c;化学回收&#xff0c;特别是通过均相催化&#xff0c;有望将塑料垃圾转化为有价值的产品。由于聚烯烃链的结构不均匀性和功能化&#xff0c;聚合物废物对催化循环提出了挑战…

计算机网络第4章-IPv6和寻址

IP地址的分配 为了获取一块IP地址用于一个组织的子网内&#xff0c;于是我们向ISP联系&#xff0c;ISP则会从已分给我们的更大 地址块中提供一些地址。 例如&#xff0c;ISP也许已经分配了地址块200.23.16.0/20。 该ISP可以依次将该地址块分成8个长度相等的连续地址块&…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - E)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - 数学思维 乘法排列组合 D、矩形总面积 - 推导公式 找规律 &#xff08;1&#xff09;暴力大法好 50% &#xff08;2&#xff09;正解 100% E、蜗牛 - &#xff08;我以为是模拟…

java八股文(mysql篇)

什么是关系型数据库&#xff1f; 其是建立在关系模型基础上的一种数据库&#xff0c;这种关系分为&#xff1a;一对一&#xff0c;一对多&#xff0c;多对多。 我们的数据存放在表中&#xff0c;在表中会有一至多个字段&#xff0c;一行就是一条数据。 mysql有哪些字段呢&…

【MySQL】用户管理权限控制

文章目录 前言一. 用户管理1. 创建用户2. 删除用户3. 修改用户密码 二. 权限控制1. 用户授权2. 查看权限3. 回收权限 结束语 前言 MySQL的数据其实也以文件形式保存&#xff0c;而登录信息同样保存在文件中 MySQL的数据在Linux下默认路径是/var/lib/mysql 登录MySQL同样也可以…

如何在macbook上删除文件?Mac删除文件的多种方法

在使用MacBook电脑时&#xff0c;桌面上经常会积累大量的文件&#xff0c;而这些文件可能已经不再需要或已经过时。为了保持桌面的整洁和提高电脑性能&#xff0c;我们需要及时删除这些文件。本文将介绍MacBook怎么删除桌面文件&#xff0c;以及macbook删除桌面文件快捷键。 一…

C 语言左移位操作在kernel驱动子系统中的特殊用途

文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…

Flutter 07 框架和三棵树(Widgets、Elements和RenderObjects)

一、Flutter框架的整体结构&#xff1a; Flutter是Google推出并开源的跨平台开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过Dart语 言开发Flutter应用&#xff0c;一套代码同时运行在ios和Android平台。不仅如此&#xff0c;Flutter还支持Web、桌面、嵌 入应…

【工具】OCR方法|不用下载额外的软件,提取扫描中英文PDF的目录文本的最优解!(一)

需求&#xff1a; 1&#xff09;从PDF里快速提取目录&#xff1b; 2&#xff09;不想下载任何软件。 我提取出来的目录文本会用于嵌入到PDF中&#xff0c;向PDF批量添加目录的软件以及软件的使用方法可以看我上一篇文章&#xff1a;PDF批量插入目录。 以下是我自己能想到的方…

基于yolov2网络的人脸识别系统matlab仿真,包括识别正脸,侧脸等

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、训练阶段 4.2、预处理阶段 4.3、识别阶段 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................…

FastGPT | 3分钟构建属于自己的AI智能助手

这是一篇使用指南&#xff01;&#xff01;&#xff01; FastGPT是什么&#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&…

BEV-YOLO 论文学习

1. 解决了什么问题&#xff1f; 出于安全和导航的目的&#xff0c;自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个&#xff1a;第一种传感器融合方案整合激光雷达、相机和毫米波雷达&#xff0c;和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…

一句话说明:企业架构框架鼻祖Zachman

问&#xff1a;禁止废话&#xff0c;一句话表达&#xff0c;Zachman是什么&#xff1f;包含哪些内容&#xff1f; 韩老师正经回答&#xff1a;Zachman是企业架构框架鼻祖&#xff0c;包含6行6列的矩阵式架构内容。6列是5W1H&#xff08;What、How、Where、Who、When、Why&…