首页 > 其他分享 >动态规划求最大子序列的乘积(含负数)

动态规划求最大子序列的乘积(含负数)

时间:2024-10-27 16:17:28浏览次数:7  
标签:乘积 nums int max maxSoFar 负数 result 序列 Math

整个过程是遍历数组,时间复杂度为O(n)

设f(n)为[0,n]区间内以n结尾的最大乘积

g(n)表示[0,n]区间内以n结尾的最小乘积

为什么设定g(n):因为当这个最小乘积为负数时,遍历到的当前数也是一个负数,相乘后会得到一个较大的数。我们得考虑这个数是否为最大

状态转移方程为:

f(n)=max(f(n-1)×a[n],a[n],g(n-1)×a[n]):所有的可能性都要考虑到,特别是g(n-1)×a[n]

g(n)=min(f(n-1)×a[n],a[n],g(n-1)×a[n]):当a[n]为负数时,f(n-1)×a[n]是最小的(假设f(n-1)为正数)

代码如下:

public class MaxProduct {
    //这是主要的函数
    public static int maxProduct(int[] nums) {
        //进行初始化
        int maxSoFar = nums[0];//表示f(n)
        int minSoFar = nums[0];//表示g(n)
        int result = nums[0];
        //整个过程其实就是遍历数组,不要想的太复杂,不理解动态规划就把它当成遍历数组就好
        for (int i = 1; i < nums.length; i++) {
            int tempMax = Math.max(nums[i], Math.max(maxSoFar * nums[i], minSoFar * nums[i]));
            minSoFar = Math.min(nums[i], Math.min(maxSoFar * nums[i], minSoFar * nums[i]));
            maxSoFar = tempMax;
            result = Math.max(result, maxSoFar);
        }
        return result;
    }
    
    public static void main(String[] args) {
        int[] nums = {-2, 3, 0, 4, -2,-1,3,6};
        System.out.println(maxProduct(nums));
    }
}

希望可以帮助到你

标签:乘积,nums,int,max,maxSoFar,负数,result,序列,Math
From: https://blog.csdn.net/2301_80969630/article/details/143270250

相关文章

  • 数据结构与算法——Java实现 46. 从前序与中序遍历序列构造二叉树
    努力的意义大概就是当好运来临的时候你觉得你值得                                                ——24.10.24105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder 和 inorder ,其中 preorder 是......
  • 基于MATLAB的混沌序列图像加密程序
    设计目的图像信息生动形象,它已成为人类表达信息的重要手段之一,网络上的图像数据很多是要求发送方和接受都要进行加密通信,信息的安全与保密显得尤为重要,因此我想运用异或运算将数据进行隐藏,连续使用同一数据对图像数据两次异或运算图像的数据不发生改变,利用这一特性对图像信息......
  • 代码随想录算法训练营day26|455.分发饼干 376. 摆动序列 53. 最大子序和
    学习资料:https://programmercarl.com/贪心算法理论基础.html#算法公开课贪心算法Part1求局部最优解,最终达到全局最优455.分发饼干(大胃口吃大饼干)点击查看代码classSolution(object):deffindContentChildren(self,g,s):""":typeg:List[int]......
  • Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)
    前言本来想着给自己放松一下,刷刷博客,慕然回首,线程、程序、进程?Java序列化?Java中IO流?JavaIO与NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***简述线程、程序、进程的基本概念。以及他们之间关系是什......
  • LLM-Mixer: 融合多尺度时间序列分解与预训练模型,可以精准捕捉短期波动与长期趋势
    近年来,大型语言模型(LargeLanguageModels,LLMs)在自然语言处理领域取得了显著进展。受此启发,研究人员开始探索将LLMs应用于时间序列预测任务的可能性。由于时间序列数据与文本数据在特征上存在显著差异,直接将LLMs应用于时间序列预测仍面临诸多挑战。为了解决这一问题,Jin等......
  • 鸿蒙编程江湖:ArkTS 的多线程与序列化支持
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。提升性能的高级技术在当今的软件开发领......
  • 一个序列划分的结论
    题面划分序列(divide)给定一个长度为的序列,现在要求把这个序列分成恰好若干段(每一段是一个连续子序列,且每个元素恰好属于一段),并且每段至少有一个元素,使得和最大的那一段的和最小。请你求出这个最小值。输入格式第一行两个整数,表示序列长度和所需段数。第二行个整数,表示......
  • 多特征变量序列预测(五) CEEMDAN+CNN-LSTM风速预测模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(二)EEMDEMD、EEM......
  • NeurIPS 2024 | 时间序列(Time Series)论文总结
    NeurIPS2024于2024年12月10号-12月15号在加拿大温哥华举行(Vancouver,Canada),录取率25.8%本文总结了NeurIPS2024有关时间序列(timeseriesdata)的相关论文,主要包含如有疏漏,欢迎大家补充。时间序列Topic:预测,插补,分类,生成,因果分析,异常检测,LLM以及基础模型等内容。总计60篇,......
  • 需要做聚类、分类、时间序列分析,用什么工具比较好
    进行聚类、分类、和时间序列分析时,选择合适的工具非常重要。1、聚类分析工具:Scikit-learn、Weka、SparkMLlib。2、分类分析工具:TensorFlow、PyTorch、XGBoost。3、时间序列分析工具:Statsmodels、FacebookProphet、Keras。Scikit-learn提供了丰富的聚类算法,如K-Means、DBSCAN等,......