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

动态规划问题 -- 子数组模型(乘积最大数组)

目录

  • 动态规划分析问题五步曲
  • 题目概述
  • 代码编写

动态规划分析问题五步曲

不清楚动态规划分析问题是哪关键的五步的少年们可以移步到
链接: 动态规划算法基础
这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的

题目概述

链接: 乘积最大子数组
在这里插入图片描述

  1. 状态表示(题目要求+自己的经验)
    根据惯例提出本题状态表示:dp[i]即表示以第i个位置为结尾的子数组最大值之乘积

不过根据题意,我们发现第nums[i]个数可能是正数,也可能是负数
如果是正数,一个尽可能大的子数组乘以正数就会得到另一个尽可能大的子数组这无可厚非
但是如果是负数呢,必须一个尽可能小的子数组乘以负数才能得到一个尽可能大的子数组!!!
所以要得到尽可能大的子数组必须得有两个状态 :

  1. correctDp[i] : 表示以第i个位置为结尾的乘积尽可能大的子数组
  2. loseDp[i] : 表示以第i个位置为结尾的乘积尽可能小的子数组
  1. 状态转移方程推导
    第nums[i]个位置有三种情况 即 正数或负数或0
    :若nums[i]为0,那么很简单了,如何数乘以0都等于0,根据状态表示此时correctDp[i] = loseDp[i] = 0
    根据我们上面的状态表示分析
    :若nums[i] > 0 , 一个尽可能大的子数组乘以正数就会得到另一个尽可能大的子数组
    *************** ,一个尽可能小的子数组乘以正数就会得到另一个尽可能小的子数组
    :若nums[i] < 0 , 一个尽可能小的子数组乘以负数就会得到另一个尽可能大的子数组
    *************** ,一个尽可能大的子数组乘以负数就会得到另一个尽可能小的子数组

得出状态转移方程 :
在这里插入图片描述

  1. 初始化(防止越界+结合状态表示初始化)
    根据状态转移方程,当i = 0时会发生越界
    根据状态表示和题目要求 :
    correctDp[0] = loseDp[0] = nums[0]即可
  1. 填表顺序(分析要填i位置前一个依赖状态的位置)
    本题两个dp表显然都是从左到右填表
  1. 返回值(由题目要求来)
    因为不确定乘积最大的子数组是以哪个位置结尾的,所以没for循环一次就记录当前的最大值

代码编写

有了动态规划五步曲我们就可以写出非常优雅的代码了

int maxProduct(vector<int>& nums) {int n = nums.size();if(n == 1) return nums[0];//一个记录乘积最小的子数组,一个记录乘积最大的子数组vector<int>correctDp(n);auto  loseDp = correctDp;int correctMax = nums[0];loseDp[0] = correctDp[0] = nums[0];for(int i = 1 ; i < n ; i++){//如果为正数,那么肯定是乘积最大的子数组乘以正数是乘积最大的子数组//                   乘积最小的子数组乘以正数是乘积最小的子数组if(nums[i] > 0){correctDp[i] = max(correctDp[i-1]*nums[i],nums[i]);loseDp[i] = min(loseDp[i-1]*nums[i],nums[i]);}//如果是负数,那么肯定是乘积最小的子数组乘以负数得到乘积最大的子数组//                     乘积最大的子数组乘以负数得到乘积最小的子数组else if(nums[i] < 0){correctDp[i] = max(loseDp[i-1]*nums[i],nums[i]);loseDp[i] = min(correctDp[i-1]*nums[i],nums[i]);}else{correctDp[i] = loseDp[i] = 0;}correctMax = max(correctMax,max(correctDp[i],loseDp[i]));}return correctMax;}

少年,今天你又进步了一点点哟,明天继续加油吧
在这里插入图片描述

http://www.dtcms.com/a/394591.html

相关文章:

  • 【AIGC】大模型面试高频考点18-大模型压力测试指标
  • Cannot find a valid baseurl for repo: base/7/x86_64
  • Lowpoly建模练习集
  • 六、kubernetes 1.29 之 Pod 控制器02
  • OpenCV:人脸检测,Haar 级联分类器原理
  • 类和对象 (上)
  • FreeRTOS 队列集(Queue Set)机制详解
  • 【论文速递】2025年第20周(May-11-17)(Robotics/Embodied AI/LLM)
  • 【秋招笔试】2025.09.21网易秋招笔试真题
  • C++ 之 【特殊类设计 与 类型转换】
  • 第14章 MySQL索引
  • Entities - 遍历与查询
  • TargetGroup 全面优化:从六个维度打造卓越用户体验
  • Proxy与Reflect
  • 浅解Letterbox算法
  • 【Triton 教程】triton_language.permute
  • JavaScript洗牌算法实践
  • 掌握timedatectl命令:Ubuntu 系统时间管理指南
  • 【RT Thread】RTT内核对象机制详解
  • Seata分布式事务
  • 用例图讲解
  • makefile原理
  • AUTOSAR CP开发流程总结
  • 通过VNC实现树莓派远程桌面访问
  • linux信号done
  • BeanUtils.copyProperties 映射规则详解
  • 物联网 frid卡控制
  • LeetCode刷题记录----322.零钱兑换(Medium)
  • 2015/07 JLPT听力原文 问题四
  • Redis集群实验