我有一个复发关系:
f(a,b) = f(a-1,b)+f(a-2,b-1)+f(a-1,b-1)
其中约束:1 <= a <= 10 ^ 9和1 <= b <= 1000。我尝试使用递归来找出值,但是时间复杂度很高。我也尝试使用dp表,但是时间复杂度也很高。另外,由于a最多可以达到10 ^ 9,因此无法创建这么大的表,因为空间复杂度太高,并且我会遇到运行时错误。 我想优化此代码,以减少其时间复杂度。谁能帮助我实现这一目标?我的意思是要使用哪种数据结构,或者应该实现哪种算法?
答案 0 :(得分:0)
顺便说一句,这对于CS StackExchange是一个更好的问题。由于您的变量是有界的(尤其是b
),因此我们可以将f(a, b)
视为仅接受一个由n
定义的数字n=1000*a+b
。然后a=n/1000
和b=n%1000
。基于此归约定义一个新函数g(n)=f(a, b)
。然后我们有
g(n) = g(n-1000) + g(n-2001) + g(n-1001)
使用标准线性递归公式,我们得到
g(n) = A*p^n + B*q^n + C*r^n
其中p
,q
和r
是方程x^2001-x^1001-x^1000-1=0
的实解。然后,您将根据初始条件(例如,当A
和B
较小时,C
的值来求解f(a, b)
,a
和b
。然后,您将拥有一个无需递归的显式公式。请注意,多项式在数值上不是很稳定,因此在寻找根时需要小心。