|
|
1
5
下面是一个建议的解决方案:
最大结果是主函数,最小值和最大值是辅助函数。后者返回子序列a[i..j]可以获得的最小和最大结果。
我还没有证明它的正确性,但是我已经用一个带有数千个小的随机生成的输入的暴力解决方案验证了它的输出。
编辑 我对这个问题考虑得更多了,我相信它可以简化为一个更简单的问题,所有的值(严格地)都是正的,只允许使用运算符*和+。 只需去掉序列中的所有零,并用它们的绝对值替换负数。
在这个简化之后,简单的动态规划算法就可以工作了。 编辑2
best[i]是子序列b[0..(i-1)]可以获得的最大结果。 编辑3
这是一个支持
我还将使用以下易于证明的引理:
引理2:
就这样。 每一个因子的符号都无关紧要,因为你总是可以通过使用一元负号使乘积为正。因此,为了使产品最大化,我们需要使每个因素的绝对值最大化。
由 引理2 各因子所能达到的最大绝对值是各项绝对值之和。这可以通过以下方式实现: 如果x_1为正,则将所有正项相加,并减去所有负项。如果x_1为负,则减去所有正项,再加上所有负项。 这意味着每一项的符号并不重要,我们可以考虑每一个数字的绝对值,只使用运算符+内因子。从现在开始,让我们考虑所有的数字都是正的。
关键的一步是
引理1 我们可以将其分解为两个较小的因子,每个因子包含2个或多个项(因此,每个项加起来等于2个或多个项),而不减少总结果。我们可以反复分解,直到没有超过3项的因素。 这就完成了论证。我还没有找到一个完整的理由来证明最初的假设。但我用数百万个随机生成的案例测试了我的代码,却无法破解它。 |
|
|
2
3
在O(N)中可以找到一个合理的大值。这是一个贪婪的算法。
1O(N),2。O(N),3。O(N),4。O(N),5。O(1),6。O(N),7。O(N),8。O(N),9。O(1),10。O(1),11。O(1),12。O(1),13。O(1), 因此整个算法的运行时间为O(N)。
|
|
|
3
2
您应该能够用动态编程来实现这一点。让
编辑: 我认为您需要使用每个子序列计算最大和最小可计算值。所以呢
|
|
4
1
用反波兰语处理这个问题-这样你就不用处理括号了。接下来在每个-ve数字前面加一个-e(从而使其为正)。最后把它们加起来。不确定复杂性,可能是
|
|
|
5
0
我觉得这是NP完全的,虽然我还没有弄清楚如何减少。如果我是对的,那么我可以说
|
|
|
6
0
这是我在stackoverflow上的第一篇帖子,因此我提前为错过任何初步礼仪道歉。此外,为了充分披露,戴夫提请我注意这个问题。
下面是伪代码的样子:
|
|
|
7
0
|
|
|
Thomas · 使类型别名在F中不可互换# 3 年前 |
|
sdgfsdh · 我该怎么说。使用异步转换函数进行收集? 7 年前 |
|
|
Soldalma · 我可以实例化包含顶级副作用值的类吗? 7 年前 |
|
|
matekus · F#-包含数字的字符串的自然排序 7 年前 |
|
|
matekus · F#类型匹配-无法创建映射或匹配记录 7 年前 |
|
|
Rob Lyndon · 未找到F#ProvidedTypes文件 7 年前 |
|
|
red-swan · 如何将intro ML.Net演示翻译为F#? 7 年前 |
|
|
jkone27 · F#-在编译时从字符串生成简单的空类型 7 年前 |