解决模式无效(需要删除)的组合问题
Solving the combination problem where a pattern is invalid (needs to be removed)
问题在N天,一个学生可以缺席也可以缺席,但是不允许连续缺席3天以上。因此,组合总数为 - 2^N
,其中每天只有 2 个选项,A - 缺席或 P - 存在
让我们取 N as 7
,这意味着总组合是 - 2^7 = 128
现在无效的模式是 AAA, AAAA, AAAAA, AAAAAA, AAAAAAA
,因此需要从总值中删除它们,以下是我的理解:
1. 3 Absent together:
AAAP--- - 2^3 = 8
---PAAA - 2^3 = 8
PAAAP-- - 2^2 = 4 * 3C1 (as there are such combinations) = 12
Total - 28
2. 4 Absent together:
AAAAP-- - 2^2 = 4
--PAAAA - 2^2 = 4
PAAAAP- - 2 *2 = 4
Total - 12
3. 5 Absent together:
AAAAAAP- - 2
-PAAAAAA - 2
PAAAAAP - 1
Total - 5
4. 6 Absent together:
AAAAAAP
PAAAAAA
Total - 2
5. 7 Absent together:
AAAAAAA
Total - 1
总无效 - 28 + 12 + 5 + 2 + 1 = 48
有效组合总数 - 128 - 48 = 80
请告诉我我推导的是否正确,或者我的理解有误
让我们制作循环方程。长度的有效组合 k
可能以 0、1 或 2 个“A”结尾 - 表示此类变体的数量 v0, v1 and v2
。
如果我们将“P”添加到长度 k
的任何有效组合中,我们就可以得到长度 k+1
与零结尾“A”的有效组合
v0(k+1) = v0(k) + v1(k) + v2(k)
如果我们将“A”添加到长度 k
的任何零结尾组合中,我们就可以得到长度 k+1
与一个结尾“A”的有效组合
v1(k+1) = v0(k)
如果我们将“A”添加到长度 k
的任何单结尾组合中,我们就可以得到长度 k+1
和两个结尾“A”的有效组合
v2(k+1) = v1(k)
现在看Python代码(Ideone example)
v0 = 1
v1 = 0
v2 = 0
for i in range(10):
v0, v1, v2 = v0 + v1 + v2, v0, v1
print(i, v0)
结果是
0 1
1 2
2 4
3 7
4 13
5 24
6 44
7 81
8 149
9 274
注意你有错误v(7) = 81
,不是80
这是 tribonacci sequence 更简单的递归表达式:
a(n) = a(n-1) + a(n-2) + a(n-3)
问题在N天,一个学生可以缺席也可以缺席,但是不允许连续缺席3天以上。因此,组合总数为 - 2^N
,其中每天只有 2 个选项,A - 缺席或 P - 存在
让我们取 N as 7
,这意味着总组合是 - 2^7 = 128
现在无效的模式是 AAA, AAAA, AAAAA, AAAAAA, AAAAAAA
,因此需要从总值中删除它们,以下是我的理解:
1. 3 Absent together:
AAAP--- - 2^3 = 8
---PAAA - 2^3 = 8
PAAAP-- - 2^2 = 4 * 3C1 (as there are such combinations) = 12
Total - 28
2. 4 Absent together:
AAAAP-- - 2^2 = 4
--PAAAA - 2^2 = 4
PAAAAP- - 2 *2 = 4
Total - 12
3. 5 Absent together:
AAAAAAP- - 2
-PAAAAAA - 2
PAAAAAP - 1
Total - 5
4. 6 Absent together:
AAAAAAP
PAAAAAA
Total - 2
5. 7 Absent together:
AAAAAAA
Total - 1
总无效 - 28 + 12 + 5 + 2 + 1 = 48
有效组合总数 - 128 - 48 = 80
请告诉我我推导的是否正确,或者我的理解有误
让我们制作循环方程。长度的有效组合 k
可能以 0、1 或 2 个“A”结尾 - 表示此类变体的数量 v0, v1 and v2
。
如果我们将“P”添加到长度 k
k+1
与零结尾“A”的有效组合
v0(k+1) = v0(k) + v1(k) + v2(k)
如果我们将“A”添加到长度 k
k+1
与一个结尾“A”的有效组合
v1(k+1) = v0(k)
如果我们将“A”添加到长度 k
k+1
和两个结尾“A”的有效组合
v2(k+1) = v1(k)
现在看Python代码(Ideone example)
v0 = 1
v1 = 0
v2 = 0
for i in range(10):
v0, v1, v2 = v0 + v1 + v2, v0, v1
print(i, v0)
结果是
0 1
1 2
2 4
3 7
4 13
5 24
6 44
7 81
8 149
9 274
注意你有错误v(7) = 81
,不是80
这是 tribonacci sequence 更简单的递归表达式:
a(n) = a(n-1) + a(n-2) + a(n-3)