一个数三角形的趣味问题,描述如下:一个大三角形,被划分为10层小三角形,求出现的所有三角形个数?
比如下图中,大三角形被划分为3层,任何出现的三角形都计算在内,总共有13个,可以看做9个一层的,加3个二层的,加一个三层的,一共13个;
=
+
+
如果三角形被分为10层,显然一个一个地数不现实,其他办法就只有找规律了。看起来似乎很简单,一层一层地数就完了,但是当划分为四层以上的时候,就有其他问题出现,如图会出现很多倒三角,倒三角有大有小,统计起来太麻烦,那么有没有其他比较简单的办法?
如果把一个被划分为n层的三角形,看成是一个集合的话,并假定这个集合里面的三角形个数是f(n),那么可以把这个划分为n层的三角形看做三个n-1层的三角形的并,于是联想到容斥原理:
$$F_{count}(X)=F_{count}(A\cup B\cup C)=F_{count}(A)+F_{count}(B)+F_{count}(C)-F_{count}(A\cap B)-F_{count}(B \cap C)-F_{count}(C \cap A)+F_{count}(A \cap B \cap C)$$
跟此模型类似,但是考虑到实际情况,最外层三角形没有包括在内,因此还需要额外加1;另外,当层数为偶数时,存在一个横跨三个n-1层几个的倒三角,不属于任何一个子集,那么可以写出递推公式了
$$f(n)=3f(n-1)-3f(n-2)+f(n-3)+{{1+(-1)^n}\over 2} + 1$$
到这里就可以用for循环,根据初始值f(0)=0;f(1)=1;f(2)=5;以O(n)效率计算出来了。
其实进一步,可以尝试解出公式,最后以O(1)效率解出结果。
递推公式为差分方程:
$$f(n)-3f(n-1)+3f(n-2)-f(n-3)={{1+(-1)^n}\over 2} + 1$$
为非齐次常系数线性差分方程,可尝试先解出齐次常系数线性差分方程:
$$f(n)-3f(n-1)+3f(n-2)-f(n-3)=0$$
特征方程为:
$$\lambda ^3 -3\lambda ^2+3\lambda -1=0$$
$$\lambda _{1} = \lambda _{2} = \lambda _{3} = 1$$
那么:
$$f_{1}(n)=1 $$
$$f_{2}(n)=n $$
$$f_{3}(n)=n^2 $$
通解为:
$$f_{c}=C_{1} + C_{2}n + C_{3}n^2$$
再解出特解:
$$f_{p}(n)={{n^3}\over 4} + {(-1)^n\over 16}$$
最后根据f(0)=0;f(1)=1;f(2)=5三个初始值,解出$C_{1},C_{2},C_{3}$,最后的解是:
$$f(n)={n^3\over 4} + {5n^2\over 8} + {n\over 4} - {1\over 16} + {(-1)^n\over 16}$$
那么10层的时候,代入就可得f(10)=315
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。