📜  子序列增加的最大乘积(1)

📅  最后修改于: 2023-12-03 15:25:01.947000             🧑  作者: Mango

子序列增加的最大乘积

子序列是指在原序列中保持元素相对顺序的情况下,从原序列中截取一部分元素形成的序列。

给定一个整数序列,求它的一个非空子序列,使得该子序列中的元素按照递增顺序排列后,其乘积最大。

解题思路

设 $dp[i]$ 表示以第 $i$ 个元素为结尾的子序列中,最大的乘积。

考虑将第 $i$ 个元素加入以前面元素结尾的最长递增子序列中。

  • 若以第 $i$ 个元素结尾的最长递增子序列长度为 $1$,则 $dp[i]=\max(dp[j]*a[i])$,其中 $j<i$ 且 $a[j]<a[i]$。
  • 若以第 $i$ 个元素结尾的最长递增子序列长度大于 $1$,则 $dp[i]=\max(dp[j]*a[i])$,其中 $j<i$、$a[j]<a[i]$ 且以第 $j$ 个元素结尾的最长递增子序列长度为 $k$,则 $k+1$ 即为以第 $i$ 个元素结尾的最长递增子序列长度。

最终答案即为所有 $dp[i]$ 中的最大值。注意:$dp[i]$ 初始值为 $a[i]$。

时间复杂度为 $O(n^2)$。

代码实现
def maxSubseqProduct(nums):
    n = len(nums)
    dp = [1] * n
    for i in range(n):
        for j in range(i):
            if nums[j] < nums[i]:
                dp[i] = max(dp[i], dp[j] * nums[i])
        dp[i] = max(dp[i], nums[i])
    return max(dp)
总结

本题是一道典型的动态规划问题,需要对状态方程进行分析,思考如何转移,得到最终的状态方程后,就可以写出动态规划的代码实现。

需要注意的是,本题中状态方程要考虑多种情况,需要细心思考每种情况的处理方法,才能得到正确的答案。同时,我们也需要注意掌握动态规划的时间复杂度分析方法,尽可能提高程序的效率。