【问题标题】:Maximum product ascending sub sequence最大乘积升序子序列
【发布时间】:2013-04-11 00:17:48
【问题描述】:

如何在大小为 n 的(非负)整数数组中找到大小为 k 的最大乘积升序子序列。我没有找到任何好的解决方案。子序列不必是连续的。例如:10,1,3,9,7,8,5 中的 3,7,8 用于尺寸 3。

【问题讨论】:

  • 这看起来像硬件。请描述您已经尝试过的内容。
  • 它不是硬件。我只是在看一些面试问题,然后遇到了这个。
  • 抱歉,很高兴看到您的尝试,以便我们可以帮助指导您从当前方法找到解决方案。

标签: arrays algorithm integer


【解决方案1】:

尝试减少你以前见过的问题。

  1. 解决最大长度增加子序列问题。
  2. 解决最大和增加子序列问题。
  3. 考虑如何将乘积转换为总和。 (提示:对数,为什么?)
  4. 解决最大乘积增加子序列问题。

【讨论】:

  • 很难弄清楚你的答案是怎么回事,但 +1 是个好主意。 3. 提示第 2 部分 - log ab = log a + log b.
  • 总的来说,我认为展示解决看似困难问题的一般策略很重要。尝试的一种技术是减少您以前见过的问题。我认为最大长度增加子序列是一个规范的动态规划问题。所以首先你必须知道怎么做(因为你需要通用的动态编程策略)。然后,您可以通过解决最大和增加子序列问题来使其变得更加棘手。然后一旦你注意到#3,你就会意识到你的问题只是减少到#2。还有 #3 是你提到的日志技巧
【解决方案2】:

在 Haskell 中,您可以这样做,尽管对于较大的 n 可能不是很快:

import Data.List (maximumBy, sort, subsequences)

maxSubProduct k = 
  maximumBy (\a b -> compare (foldr (*) 1 a) (foldr (*) 1 b)) 
  . filter (\x -> x == sort x) 
  . filter ((==k) . length) 
  . subsequences


OUTPUT:
*Main> maxSubProduct 3 [10,1,3,9,7,8,5]
[3,7,8]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2023-03-17
    • 2021-08-21
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多