【Day51】代码随想录之动态规划完全背包_139.单词拆分_背包总结

本文主要是介绍【Day51】代码随想录之动态规划完全背包_139.单词拆分_背包总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 动态规划理论基础
        • 动规五部曲:
        • 出现结果不正确:
      • 139.单词拆分
      • 背包问题
        • 0-1背包
        • 完全背包

动态规划理论基础

动规五部曲:
  1. 确定dp数组 下标及dp[i] 的含义。
  2. 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp数组。
  4. 确定遍历顺序:从前到后or其他。
  5. 打印。
出现结果不正确:
  1. 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。
  2. 打印dp日志和自己想的不一样:代码实现细节出现问题。

139.单词拆分

参考文档:代码随想录

分析:

  1. 将字符串s作为背包,字符数组作为物品,装入背包;
  2. 背包内的物品要求是有顺序的,所以物品装入背包是排列,遍历顺序是先背包再物品。
  3. dp[i]表示的含义是字符串的0-i是否能与字符串组中的字符串匹配,匹配为true,结果是如果dp[s.size()] == true; return true;
  4. 递推公式是:从i位置往前截取j个单位,如果[i-j, i]切割的字符串出现在了字符数组中且i-j位置的dp为true,更新dp[i-j, i] = true; 即if([i-j] ∈ wordDict && dp[i-j] == true) dp[i] = true。

代码:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {//将s设为背包//wordDict中的单词再s中是否有合适的排列数(强调顺序与s的顺序一致)//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 =  1; j <= i; j++){string tmp = s.substr(i-j,j);if(wordSet.find(tmp) != wordSet.end() && dp[i-j]){dp[i] = true;}}}return dp[s.size()];}
};

背包问题

参考:代码随想录
在物品的数量只有一个还是无数个上面

0-1背包

每个物品的数量只有一个
二维数组:f背包,物品遍历顺序任意
滚动数组:必须先物品再背包,背包的遍历顺序为倒序。
应用:

  1. 背包装物品的最大价值数:dp[j] = max(dp[j], dp[j-nums[j]]+vaule[i]);
  2. 装满背包方法数:dp[j] += dp[j-nums[i]];
  3. 能否装满背包:dp[j] = max(dp[j], dp[j-nums[j]]+vaule[i]); return dp[last] == target;
  4. 装满背包的最小物品数:dp[j] = min(dp[j], dp[j-nums[i]]+1);
完全背包

每个物品的数量有无数个
滚动数组的背包和物品的遍历顺序任意,内层循环体必须从小到大,有累加效果。
应用:

  1. 排列数:先背包再物品,给出一个集合和目标值。
  2. 组合数:先物品再背包,给出一个集合和目标值。
  3. 求满足的最小方法数
  4. 单词拆分:截取字串与字符数组匹配再结合截取位置的dp值判断当前位置的dp值。

相关题目:
代码随想录
在这里插入图片描述

这篇关于【Day51】代码随想录之动态规划完全背包_139.单词拆分_背包总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729067

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)