让 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,则为
答案 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溢出。