【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

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)