[zZ]常见递推关系解法

来源:互联网 发布:淘宝新店0元购 编辑:程序博客网 时间:2024/05/17 02:18

常见递推关系解法

1.  a[n+1]=a[n]+f(n)  ->  a[n]=a[1]+sum(f(k) |1<=k<n)
移项后叠加:a[n]=a[1]+sum(f(k) |1<=k<n)

2.a[n+1]=a[n]*f(n)  ->  a[n]=a[1]*mul(f(k) | 1<=k<n)
移项后叠乘:a[n]=a[1]*mul(f(k) | 1<=k<n)

3.a[n+1]=p*a[n]+q  ->  a[n]=a[1] + (a[2]-a[1])*(1- p^(n-1))/(1-p)
  相减得(a[n+1]-a[n])=p*(a[n]-a[n-1]),即b[n+1]=p*b[n];
  所以a[n+1]-a[n]=(a[2]-a[1])*p^n
  移项叠加得a[n] = a[1] + sum(a[k]-a[k-1] | 1<k<=n)
= a[1] + (a[2]-a[1])*(1- p^(n-1))/(1-p);

4.a[n+1]=p*a[n]+q(n)  ->  a[n]= ( a[1]/p + sum(q(k)/p^(k+1)) )*p^(n+1)
  两边除p^(n+1)得,a[n+1]/p^(n+1) = a[n]/p^n + q(n)/p^(n+1)
即b[n+1]=b[n]+q(n)/p^(n+1),
形式同1,可解得:b[n]=b[1]+sum(q(k)/p^(k+1) | 1<=k<n)
所以a[n]=b[n]*p^(n+1);

5.a[n+1]=p(n)*a[n]+q(n)  ->  a[n]=(a[1]*f(1)+sum(q(k)/f(k+1))) / f(n)
令p(n)=f(n)/f(n+1),则a[n+1]*f(n+1)=a[n]*f(n)+q(n)*f(n+1)
即b[n+1]=b[n]+q(n)*f(n+1),形式同1。
可解得b[n]=b[1]+sum(q(k)/f(k+1)),a[n]=b[n]/f(n)
即a[n]=(a[1]*f(1)+sum(q(k)/f(k+1))) / f(n)

6.线性齐次递推关系(如a[n]=a[n-1]+2*a[n-2]+a[n-1])
  ①给出相应的特征方程(如x^3 - x^2 - 2*x - 1=0),求解特征方程得到根h1,h2..
  ②如果没有重根,则直接代入初始条件解
a[n]=c1*(h1^n)+c2*(h2^n)+c3*(h3^n)+…的常数c1,c2,c3….可得通项公式。
  ③若有重根,比如h2=h3=h4≠h1,则——
a[n]=c1*(h1^n)+c2*(h2^n)+c3*n*(h3^n)+c4*(n^2)*(h4^n),代入初始条件解出常数c1,c2…,可得通项公式。

7.当然也可以用矩阵乘法来logN解线性齐次递推关系:
对于a[n]=k1*a[n-1]+k2*a[n-2]+k3*a[n-4],构造矩阵G
0  1  0  0
0  0  1  0
0  0  0  1
K3 0  k2  k1
在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。
最后An=A0*G^n为结果矩阵(A0为初始矩阵)


不过更多时候遇到的会是更复杂的递推关系,这时需要的是通过换元,待定系数构造,周期性甚至猜想,数学归纳等等方式技巧来灵活处理。
当然数据规模不太大的,或者递推关系增长很快的情况下也可以直接打表递推,不一定非要解出通项公式,事实上ACM中很多题都是这样。

作者:pumpkinsm@Pumpkin's
地址:http://ppksm.com/blog/read.php?158
欢迎转载,转载时请以链接形式注明作者和原始出处。=v=

原创粉丝点击