计算受限制的整数分区数

时间:2017-09-17 16:32:07

标签: math integer dynamic-programming

原始问题:

N 为正整数(实际上,N <= 2000)和 P - <的所有可能分区的集合strong> N ,其中包含。让 A 为分区数。找到 A

输入: N 。输出: A - 分区数

我尝试了什么:

我认为这个问题可以通过基于动态的算法来解决。设 p(n,a,b)为函数,仅使用数字 a 返回 n 的分数。 。 。的 B'/ strong>即可。然后我们可以使用以下代码计算 A

int Ans = 2; // the 1+1+...+1=N & N=N partitions
for(int a = 2; a <= N/2; a += 1){ //a - from 2 to N/2
    int b = a*2-1;
    Ans += p[N][a][b]; // add all partitions using a..b to Answer
    if(a < (a-1)*2-1){              // if a < previous b [ (a-1)*2-1 ]
        Ans -= p[N][a][(a-1)*2-1];  // then we counted number of partitions
    }                               // using numbers a..prev_b twice.
}

接下来,我试图找到计算任何整数a&lt; = b&lt; = n的 p(n,a,b)的动态算法。 This paper (.pdf)提供以下算法: I(n <= b) = 1,如果n&lt; = b且= 0,则为

问题(S):

  1. 我应该如何从纸上实现算法?我是d-p问题的新手,我可以看到,这个问题有3个维度(n,a和b),这对我来说非常棘手。
  2. 该算法的实际效果如何?我知道计算 p(n,0,b) p(n,a,n)的算法是如何工作的,但对 p的一点解释( n,a,b)会非常有帮助。
  3. 原始问题是否有更简单的解决方案?我很确定还有另一个干净的解决方案,但我没有找到它。

1 个答案:

答案 0 :(得分:0)

我用记忆方法(自上而下的动态编程)在23秒内计算了所有A(1)-A(600)。 3D表需要1.7 GB的内存 供参考:A[50] = 278, A(200)=465202, A(600)=38860513616

对于32位环境,N = 2000需要太大的表,并且映射方法工作得太慢。

我可以制作具有合理大小的2D表,但是这种方法需要在外部循环的每次迭代时进行表归零 - 再次变慢。 A(1000) = 107292471486730 in 131 sec。我认为较大的值可能需要较长的算术来避免Int64溢出。