【动态规划】子数组系列

文章目录

  • 动态规划(子数组系列)
    • 1. 最大子数组和
    • 2. 环形子数组的最大和
    • 3. 乘积最大子数组
    • 4. 乘积为正的最长子数组的长度
    • 5. 等差数列划分
    • 6. 最长湍流子数组
    • 7. 单词拆分
    • 8. 环形字符串中的唯一的子字符串

动态规划(子数组系列)

1. 最大子数组和

题目链接

  1. 状态表示

    dp[i]表示到 i 位置时所有子数组的最大和

    如下展示的这样:

    vqwloeygdl-1690446970449.png

  2. 状态转移方程

    image-20230727163820237

  3. 初始化

    为了方便初始化,采用虚拟节点的方式,这里初始化dp[0] = 0

  4. 填表

    从左到右

  5. 返回值

    由于每个dp表里的每个值都表示到这个位置的最大子数组的和,所有需要返回最大值

AC代码:

class Solution 
{
public:int maxSubArray(vector<int>& nums) {int n = nums.size();vector<int> dp(n + 1);int ret = -0x3f3f3f3f;for (int i = 1; i <= n; i++){dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);ret = max(ret, dp[i]);}return ret;}
};

2. 环形子数组的最大和

题目链接

分析题目:这道题目可以取环形数组,是不是可以像之间做的环形的打家劫舍题目一样来解决?

还是分为两种情况来考虑:

image-20230727170118674

如果最大和是蓝色区域的部分,只需要求出最大子数组的和就可以

image-20230727170242287

如果是这样,由于数组整体的和是固定的,只需要求出中间的最小值然后相减即可

  1. 状态表示

    讲过前面的题目分析,发现这个题目需要两个状态表示:

    f[i]表示到 i 位置时所有子数组,子数组和最大的值

    g[i]表示到 i 位置时所有子数组,子数组和最小的值

  2. 状态转移方程

    aj6flq76wn-1690449418341.png

  3. 初始化

    采用虚拟节点的方式

  4. 填表

  5. 返回值

    返回两种情况的较大值

AC代码:

class Solution 
{
public:const int N = 0x3f3f3f3f;int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1), g(n + 1);int fMax = -N, gMin = N, sum = 0;for (int i = 1; i <= n; i++){f[i] = max(nums[i - 1], f[i - 1] + nums[i - 1]);fMax = max(fMax, f[i]);g[i] = min(nums[i - 1], g[i - 1] + nums[i - 1]);gMin = min(gMin, g[i]);sum += nums[i - 1];}if (sum == gMin) return fMax;else return max(fMax, (sum - gMin));}
};

3. 乘积最大子数组

题目链接

  1. 状态表示

    f[i]表示以 i 为结尾所有子数组中最大乘积

    g[i]表示以 i 为结尾所有子数组中最小乘积

  2. 状态转移方程

    iw2g8vi80l-1690451692326.png

  3. 初始化

    虚拟节点的方式,为了不影响后续的填表采用f[0] = 1, g[0] = 1

  4. 填表

    从左到右

  5. 返回值

    返回乘积最大的即可

AC代码:

class Solution 
{
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1), g(n + 1);f[0] = g[0] = 1;int ret = -0x3f;for (int i = 1; i <= n; i++){if (nums[i - 1] < 0){f[i] = g[i - 1] * nums[i - 1];g[i] = f[i - 1] * nums[i - 1];}if (nums[i - 1] > 0){f[i] = f[i - 1] * nums[i - 1];g[i] = g[i - 1] * nums[i - 1];}f[i] = max(nums[i - 1], f[i]);g[i] = min(nums[i - 1], g[i]);ret = max(ret, f[i]);}return ret;}
};

4. 乘积为正的最长子数组的长度

题目链接

  1. 状态表示

    f[i]表示:以 i 位置为结尾所有子数组中乘积为正数的最大长度

    g[i]表示:以 i 位置为结尾所有子数组中乘积为负数的最大长度

  2. 状态转移方程

    j9nbdlukzq-1690458122443.png

  3. 初始化

    f[0] = 1, g[0] = 0

  4. 填表

  5. 返回值

    返回乘积为正的最大长度

AC代码:

class Solution 
{
public:int getMaxLen(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1), g(n + 1);int ret = -0x3f3f3f3f;for (int i = 1; i <= n; i++){if (nums[i - 1] > 0){f[i] = max(1, f[i - 1] + 1);g[i] = max(0, g[i - 1] == 0 ? 0 : g[i - 1] + 1);}if (nums[i - 1] < 0){f[i] = max(0, g[i - 1] == 0 ? 0 : g[i - 1] + 1);g[i] = max(1, f[i - 1] + 1);}ret = max(ret, f[i]);}return ret;}
};

5. 等差数列划分

题目链接

  1. 状态表示

    dp[i]表示到 i 位置时,所有是等差数列子数组之和

  2. 状态转移方程

    pgq8pckp7f-1690506578443.png

  3. 初始化

    为了防止后续的填表不越界dp[0] = 0, dp[1] = 0

  4. 填表

    从左到右

  5. 返回值

    dp表的所有元素之和

AC代码:

class Solution 
{
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();vector<int> dp(n);int sum = 0;for (int i = 2; i < n; i++){if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]){dp[i] = dp[i - 1] + 1;}sum += dp[i];}return sum;}
};

6. 最长湍流子数组

题目链接

  1. 状态表示

    f[i] 以 i 位置为结尾的所有子数组当中,最后呈现“上升” 状态下最长湍流子数组的长度

    g[i] 以 i 位置为结尾的所有子数组当中,最后呈现“下降”状态下最长湍流子数组的长度

  2. 状态转移方程

    8uo2pl28eh-1690632000050.png

  3. 初始化

    表里的数据都初始化为1

  4. 填表

    从左到右

  5. 返回值

    返回两个表的最大值

AC代码:

class Solution 
{
public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();vector<int> f(n, 1), g(n, 1);int ret = 1;for (int i =1; i < n; i++){if (arr[i] > arr[i - 1]) f[i] = g[i - 1] + 1;else if (arr[i] < arr[i - 1]) g[i] = f[i - 1] + 1;ret = max(ret, max(f[i], g[i]));}return ret;}
};

7. 单词拆分

题目链接

  1. 状态表示

    dp[i] 表示0到i之间的字符串能否被字典拼接

  2. 状态转移方程

    image-20230730124229178

  3. 初始化

    可以在字符串s前面加上一个占位符这样就可以没有下标的映射关系

  4. 填表

    从左到右

  5. 返回值

AC代码:

class Solution 
{
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> hash;for (auto e : wordDict) hash.insert(e);int n = s.size();vector<bool> dp(n + 1);dp[0] = true;s = ' ' + s;for (int i = 1; i <= n; i++){for (int j = i; j >= 1; j--){if (dp[j - 1] && hash.count(s.substr(j, i - j + 1))){dp[i] = true;break;}}}return dp[n];}
};

8. 环形字符串中的唯一的子字符串

题目链接

  1. 状态表示

    dp[i]表示到 i 位置的所有子串当中有多少个在base中出现过

  2. 状态转移方程

    wot5yvg40v-1690694243062.png

  3. 初始化

    初始化为1

  4. 填表

  5. 返回值

    由于dp表当中存的值可能是重复的,所以需要进行去重操作。相同字符串结尾的dp值,取最大的值即可

AC代码:

class Solution 
{
public:int findSubstringInWraproundString(string s) {int n = s.size();vector<int> dp(n, 1);for (int i = 1; i < n; i++){if ((s[i - 1] + 1 == s[i]) || (s[i - 1] == 'z' && s[i] == 'a')){dp[i] = dp[i - 1] + 1;}}int hash[26] = {0};int sum = 0;for (int i = 0; i < n; i++){hash[s[i] - 'a'] = max(hash[s[i] - 'a'], dp[i]);}for (auto x : hash) sum += x;return sum;}
};

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

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

相关文章

算法与数据结构(四)--排序算法

一.冒泡排序 原理图&#xff1a; 实现代码&#xff1a; /* 冒泡排序或者是沉底排序 *//* int arr[]: 排序目标数组,这里元素类型以整型为例; int len: 元素个数 */ void bubbleSort (elemType arr[], int len) {//为什么外循环小于len-1次&#xff1f;//考虑临界情况&#xf…

Neo4j 集群和负载均衡

Neo4j 集群和负载均衡 Neo4j是当前最流行的开源图DB。刚好读到了Neo4j的集群和负载均衡策略&#xff0c;记录一下。 1 集群 Neo4j 集群使用主从复制实现高可用性和水平读扩展。 1.1 复制 集群的写入都通过主节点协调完成的&#xff0c;数据先写入主机&#xff0c;再同步到…

振弦采集仪及在线监测系统完整链条的岩土工程隧道安全监测

振弦采集仪及在线监测系统完整链条的岩土工程隧道安全监测 近年来&#xff0c;随着城市化的不断推进和基础设施建设的不断发展&#xff0c;隧道建设也日益成为城市交通发展的必需品。然而&#xff0c;隧道建设中存在着一定的安全隐患&#xff0c;如地质灾害、地下水涌流等&…

springboot第32集:redis系统-android系统-Nacos Server

Error parsing HTTP request header HTTP method names must be tokens 检查发送HTTP请求的客户端代码&#xff0c;确保方法名中不包含非法字符。通常情况下&#xff0c;HTTP请求的方法名应该是简单的标识符&#xff0c;例如"GET"、"POST"、"PUT"…

《TCP IP网络编程》第十二章

第 12 章 I/O 复用 12.1 基于 I/O 复用的服务器端 多进程服务端的缺点和解决方法&#xff1a; 为了构建并发服务器&#xff0c;只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的一种方案&#xff0c;但并非十全十美&#xff0c;因为创建进程要付出很大的代价。…

免费商用 Meta 发布开源大语言模型 Llama 2

Meta 和微软深度合作&#xff0c;正式推出下一代开源大语言模型 Llama 2&#xff0c;并宣布免费提供给研究和商业使用。 Llama 2 论文地址&#xff1a;Llama 2: Open Foundation and Fine-Tuned Chat Models 据介绍&#xff0c;相比于 Llama 1&#xff0c;Llama 2 的训练数据多…

Tensorflow学习

一、处理数据的结构 案例代码如下: import tensorflow.compat.v1 as tf tf.disable_v2_behavior() import numpy as np# create data x_data np.random.rand(100).astype(np.float32) y_data x_data*0.1 0.3# 创建结构(一维结构) Weights tf.Variable(tf.random.uniform(…

C++模板

目录 函数模板隐式实例化显式实例化 类模板 下面是多种类型的交换函数 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(ch…

Redis 哨兵 (sentinel)

是什么 官网理论&#xff1a;https://redis.io/docs/management/sentinel/ 吹哨人巡查监控后台 master 主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务。 作用&#xff1a;无人值守运维 哨兵的作用&#xff1a; 1…

Pytorch深度学习-----神经网络的卷积操作

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SentencePiece android ndk编译

LLaMa等LLM语言模型一般使用SentencePiece tokenizer&#xff0c;在端侧部署需要编译和使用其c版本。 在安卓平台使用NDK编译 CMakeLists.txt需要进行一些修改&#xff1a; src/CMakeLists.txt如下位置加上log依赖&#xff0c;否则提示android log相关符号不存在。 此外&…

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点

解决IDEA的git非常缓慢方法

解决IDEA的git非常缓慢方法 xxxx\IDEA2021.1.3\IntelliJ IDEA 2021.1.3\bin

transformer代码注解

其中代码均来自李沐老师的动手学pytorch中。 class PositionWiseFFN(nn.Module):ffn_num_inputs 4ffn_num_hiddens 4ffn_num_outputs 8def __init__(self,ffn_num_inputs,ffn_num_hiddens,ffn_num_outputs):super(PositionWiseFFN,self).__init__()self.dense1 nn.Linear(ffn…

微服务项目,maven无法加载其他服务依赖

微服务项目&#xff0c;导入了工具类工程&#xff0c;但是一直报错&#xff0c;没有该类&#xff0c; 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置&#xff0c;我这是原来的maven&#xff0c;home 修改之后,就不报错了

Autosar通信实战系列02-CAN报文发送周期测试脚本开发及周期不准优化

本文框架 前言1. CAN发送报文的周期测试脚本开发2. 发送报文周期不准的可能原因及优化策略2.1 发送报文的控制逻辑2.2 送报文周期不准的可能原因及优化策略前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑…

【ArcGIS Pro二次开发】(53):村规制表、制图【福建省】

这篇算是村规入库的一个延续。 村庄规划中有一些图纸是需要严格按照规范制图&#xff0c;或形成一定规范格式的。 这些图纸的制作基本算是机械式的工作&#xff0c;可以用工具来代替人工。 一、要实现的功能 如上图所示&#xff0c;在【村庄规划】组&#xff0c;新增了两个工…

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

vue3+vite——打测试包+正式包+本地预览打包后的文件——基础积累

最近在学习vue3vite的内容&#xff0c;发现vite和webpack类似&#xff0c;下面将区别及使用方法做一下记录&#xff1a; 1.vite添加环境配置文件 ... ├── src ... ├── .env # 通用环境变量配置 ├── .env.development …