zoukankan      html  css  js  c++  java
  • Leetcode 152 乘积最大子序列

    题目描述:

     题解:仿照最大连续子序列和的思路构造dp。dp_min[i]表示以nums[i]为结尾的子序列的最小乘积、dp_max[i]表示以nums[i]为结尾的子序列的最大乘积。

    当nums[i] > 0的时候 dp_max[i] = max(nums[i],nums[i]*dp_max[i-1]); dp_min[i] = min(nums[i],nums[i]*dp_min[i-1]);

    当nums[i] < 0 的时候 dp_max[i] = max(nums[i],nums[i]*dp_min[i-1])  (这里使用dp_min[i-1]是希望dp_min也是一个负数);  dp_min[i] = min(nums[i],nums[i]*dp_max[i-1])(这里使用dp_max[i-1]是期待负数能更加小);

    AC代码:

        int maxProduct(vector<int>& nums) {
            // min  max 
            int Len = nums.size();
            int dp_min[Len+10];
            int dp_max[Len+10];
            dp_min[0] = nums[0];
            dp_max[0] = nums[0];
            int ans = nums[0];
            for(int i=1;i<Len;i++)
            {
                if(nums[i] > 0)
                {
                    dp_max[i] = max(nums[i],nums[i]*dp_max[i-1]);
                    dp_min[i] = min(nums[i],nums[i]*dp_min[i-1]);
                }
                else 
                {
                    dp_max[i] = max(nums[i],nums[i]*dp_min[i-1]);
                    dp_min[i] = min(nums[i],nums[i]*dp_max[i-1]);
                }
                ans = max(ans,dp_max[i]);
            }
            return ans;
        }
  • 相关阅读:
    Hash大法
    最小表示法
    KMP算法题集
    分块总结
    2018 雅礼国庆集训
    二分图总结
    贪心总结
    Tire树总结(模板+例题)
    工具类文章合集
    网文胡乱汇总
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12552565.html
Copyright © 2011-2022 走看看