非齐次递推转化为齐次递推的判断
在做leetcode爬楼梯这道题的时候:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
官方解法里有利用矩阵快速幂的方法。而利用矩阵快速幂关键在于将一个递推式如
f
(
n
)
=
∑
i
=
1
m
f
(
n
−
i
)
f(n) = \sum_{i = 1} ^ m f(n - i)
f(n)=∑i=1mf(n−i)这样的齐次线性递推式转换为一个矩阵
m
×
m
m\times m
m×m的矩阵
[
a
1
a
2
a
3
⋯
a
m
1
0
0
⋯
0
0
1
0
⋯
0
0
0
1
⋯
0
⋮
⋮
⋮
⋱
⋮
0
0
0
⋯
1
]
\begin{bmatrix} a_1 & a_2 & a_3 & \cdots &a_m\\ 1 & 0 & 0 & \cdots &0\\ 0 & 1 & 0 & \cdots &0\\ 0 & 0 & 1 & \cdots &0\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & 0 & \cdots & 1 \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎡a1100⋮0a2010⋮0a3001⋮0⋯⋯⋯⋯⋱⋯am000⋮1⎦⎥⎥⎥⎥⎥⎥⎥⎤根据相互关系写出递推式
[
f
(
n
)
f
(
n
−
1
)
f
(
n
−
2
)
f
(
n
−
3
)
⋮
f
(
n
−
m
−
1
)
]
=
[
a
1
a
2
a
3
⋯
a
m
1
0
0
⋯
0
0
1
0
⋯
0
0
0
1
⋯
0
⋮
⋮
⋮
⋱
⋮
0
0
0
⋯
1
]
[
f
(
n
−
1
)
f
(
n
−
2
)
f
(
n
−
3
)
f
(
n
−
4
)
⋮
f
(
n
−
m
−
2
)
]
\begin{bmatrix} f(n) \\ f(n - 1) \\ f(n - 2) \\ f(n - 3) \\ \vdots \\ f(n - m - 1) \end{bmatrix} = \begin{bmatrix} a_1 & a_2 & a_3 & \cdots &a_m\\ 1 & 0 & 0 & \cdots &0\\ 0 & 1 & 0 & \cdots &0\\ 0 & 0 & 1 & \cdots &0\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & 0 & \cdots & 1 \end{bmatrix} \begin{bmatrix} f(n - 1) \\ f(n - 2) \\ f(n - 3) \\ f(n - 4) \\ \vdots \\ f(n - m - 2) \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎡f(n)f(n−1)f(n−2)f(n−3)⋮f(n−m−1)⎦⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎡a1100⋮0a2010⋮0a3001⋮0⋯⋯⋯⋯⋱⋯am000⋮1⎦⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎡f(n−1)f(n−2)f(n−3)f(n−4)⋮f(n−m−2)⎦⎥⎥⎥⎥⎥⎥⎥⎤
当递推式为非齐次方程时,可以将其化为齐次方程再求解,例如
f ( x ) = ( 2 x − 6 ) c + f ( x − 1 ) + f ( x − 2 ) + f ( x − 3 ) f(x)=(2x−6)c+f(x−1)+f(x−2)+f(x−3) f(x)=(2x−6)c+f(x−1)+f(x−2)+f(x−3)可以化作
f ( x ) + x c = [ f ( x − 1 ) + ( x − 1 ) c ] + [ f ( x − 2 ) + ( x − 2 ) c ] + [ f ( x − 3 ) + ( x − 3 ) c ] \begin{aligned} f(x)+xc = &[f(x−1)+(x−1)c]+[f(x−2)+(x−2)c]\\ &+[f(x−3)+(x−3)c]\end{aligned} f(x)+xc=[f(x−1)+(x−1)c]+[f(x−2)+(x−2)c]+[f(x−3)+(x−3)c]令 g ( x ) = f ( x ) + x c g(x)=f(x)+xc g(x)=f(x)+xc,那么我们又得到了一个齐次线性地推公式
g ( x ) = g ( x − 1 ) + g ( x − 2 ) + g ( x − 3 ) g(x)=g(x−1)+g(x−2)+g(x−3) g(x)=g(x−1)+g(x−2)+g(x−3)
什么时候非齐次线性递推转化为齐次线性递推呢?小白想了个解法,希望各位大佬指教。设非齐次递推式一般式为
f
(
x
)
=
∑
i
=
1
n
f
(
x
−
i
)
+
m
x
+
n
(1)
f(x) = \sum_{i = 1}^n f(x - i) + mx + n\tag{1}
f(x)=i=1∑nf(x−i)+mx+n(1)目标是将其化为
f
(
x
)
+
u
x
+
v
=
∑
i
=
1
n
a
i
[
f
(
x
−
i
)
+
u
(
x
−
i
)
+
v
]
(2)
f(x) + ux + v = \sum_{i = 1} ^ n a_i[f(x - i) + u(x - i) + v]\tag{2}
f(x)+ux+v=i=1∑nai[f(x−i)+u(x−i)+v](2)然后令
g
(
x
)
=
f
(
x
)
+
u
x
+
v
g(x) = f(x) + ux + v
g(x)=f(x)+ux+v化作对应的齐次方程为
g
(
x
)
=
∑
i
=
1
n
g
(
x
−
i
)
g(x) = \sum_{i = 1} ^ ng(x - i)
g(x)=i=1∑ng(x−i)那么问题就在于式(1)能否转化为式(2)呢?将式(2)化作
f
(
x
)
=
∑
i
=
1
n
a
i
[
f
(
x
−
i
)
+
u
(
x
−
i
)
+
v
]
−
u
x
−
v
=
∑
i
=
1
n
a
i
f
(
x
−
i
)
+
(
∑
i
=
1
n
a
i
−
1
)
u
x
+
(
∑
i
=
1
n
a
i
−
1
)
v
−
∑
i
=
1
n
a
i
i
u
\begin{aligned} f(x) & = \sum_{i = 1} ^ n a_i[f(x - i) + u(x - i) + v] - ux - v\\ & = \sum_{i = 1} ^ n a_if(x - i) + (\sum_{i = 1} ^ na_i-1)ux + (\sum_{i = 1} ^ na_i-1)v - \sum_{i = 1} ^ na_iiu \end{aligned}
f(x)=i=1∑nai[f(x−i)+u(x−i)+v]−ux−v=i=1∑naif(x−i)+(i=1∑nai−1)ux+(i=1∑nai−1)v−i=1∑naiiu
也就是如果等式
m
x
+
n
=
(
∑
i
=
1
n
a
i
−
1
)
u
x
+
(
∑
i
=
1
n
a
i
−
1
)
v
−
∑
i
=
1
n
a
i
i
u
\bm\color{olive}{mx + n = (\sum_{i = 1} ^ na_i-1)ux + (\sum_{i = 1} ^ na_i-1)v - \sum_{i = 1} ^ na_iiu}
mx+n=(i=1∑nai−1)ux+(i=1∑nai−1)v−i=1∑naiiu有解,那么该非齐次方程递推便可以转化为齐次递推,根据求出的
u
u
u,
v
v
v便可以求出对应的齐次递推。
小白第一次写博客,希望各位大佬指教。😉