乘积最大子数组

问题描述与解题思路

在这里插入图片描述

题目链接

确定本题的状态表示

由于数组中可能存在负数,负数乘以负数会得到正数,因此需要同时维护当前最大值和当前最小值(因为最小值乘以负数可能变成最大值)。

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

如何理解 i i i 位置为结尾的所有子数组?
在这里插入图片描述

确定本题的状态转移方程

根据已知条件:
本题的状态转移方程:
在这里插入图片描述

填表求值

根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果

代码实现

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=nums[0];
        for(int i=0;i<n;i++){
            f[i+1]=max({nums[i],nums[i]*f[i],nums[i]*g[i]});
            g[i+1]=min({nums[i],nums[i]*f[i],nums[i]*g[i]});
            if(f[i+1]>=ret) ret=f[i+1];
            // cout <<"f["<<i+1<<"]: "<< f[i+1]<< endl;
            // cout  <<"g["<<i+1<<"]: "<< g[i+1]<< endl;
        }
        return ret;
        
    }
};
posted @ 2025-09-26 05:27  烧冻鸡翅QAQ  阅读(4)  评论(0)    收藏  举报  来源