【发布时间】:2013-01-08 19:09:10
【问题描述】:
我一直在解决一些算法编程问题,并且有一个问题。问题与本题中引用的问题相同:USACO: Subsets (Inefficient)
我能够编写一些对于高 N 来说太慢的(非动态)解决方案。不得不作弊并在网上查找一些解决方案。事实证明,快速算法非常简单,但即使知道答案,我仍然看不出如何从问题中得到答案。我可以看到等和子集形成的模式,但我看不到这些模式与算法解决方案之间的联系。
问题(上面的链接)是:
给定一组从 1 到 N (1
对于较大的集合,答案要么是 0(当 N*(N+1)/2 为奇数时),要么由以下简单算法给出:
arr = array of int with (N*(N+1)/4)+1 elements
arr[0]=1 // all other elements initialized to 0
for i = 1 to N
for j = N*(N+1) / 4 downto i
add arr[j-i] to arr[j]
subsetpaircount = arr[N*(N+1)/4] / 2
再次,我可以看到算法是如何工作的,我什至插入了打印语句,这样我就可以“观察”它是如何工作的。我只是看不出算法的操作如何与生成两组分区的不同方式的模式联系起来。
链接问题中的回答可能是相关的,但我也无法连接它是如何工作的:“这与在多项式 (x^1+1/x) 中找到系数 x^0 项相同)(x^2+1/x^2)...(x^n+1/x^n)..."
谁能为我澄清一下联系,或者指出一些解释这个特定问题的参考资料?谢谢。
【问题讨论】:
-
'increment arr[j] by arr[j-1]' 是什么意思?我认为增量是一个数字加 1 的东西。此外,算法中是否存在 arr[i] 以值 0 开头的假设?如果不是,那么数组单元的起始值是多少?
-
@Lee,抱歉,我的伪代码约定可能并不完美。我经常在 Pascal 中编程,其中函数 inc(arg1,arg2) 会将 arg1 增加 arg2 的数量。 arr[i] 确实从元素零开始,我省略了初始化它的值的关键步骤,我刚刚添加了它。 . .
-
@Lee:增量的使用是正确的。它means“增加或增加,尤其是固定规模的系列之一:“工资可以以 5 美分的增量升级。”
标签: algorithm math combinatorics partition-problem