使用重复和限制计数排列

问题描述

我想计算重复项和仅3个不同符号0,1,2的排列,以及0之后没有1的限制。

示例:

有效:01202212

无效:10...

我虽然排列了这些排列子集 是(3^count(0))*(2^count(1))*(3^count(2)),但这是错误的。如果没有,我该如何计算出exakt计数?

解决方法

很明显:
-长度为K且长度为1的有效序列可能会组成
将任何长度为K-1的有效序列加1

可能会组成长度为2的长度为K的有效序列
在长度为K-1的任何有效序列上加2

-可能组成长度为0的长度为K的有效序列
在长度为K-1,以0或2结尾的有效序列中添加0

如此简单的Python程序

def valid123(n):
    a = [[0]*3 for _ in range(n)]
    a[0][0] = 1
    a[0][1] = 1
    a[0][2] = 1
    summ = 3
    for i in range(1,n):
        a[i][0] = summ - a[i-1][1]
        a[i][1] = summ
        a[i][2] = summ
        summ = sum(a[i])
    return summ

for i in range(1,10):
    print(i,valid123(i))

给予

1 3
2 8
3 21
4 55
5 144
6 377
7 987
8 2584
9 6765

对应的OEIS sequence具有简单的循环表示形式a(n) = 3*a(n-1) - a(n-2)-斐波那契的子集,并且确实存在一些封闭式:

a(n) = (ap^n - am^n)/(ap-am),with ap := (3+sqrt(5))/2,am := (3-sqrt(5))/2