技术问询:求仅含0、1、2且2必在1之后的6位数字串数量
嘿,我来帮你理清楚这个问题!你之前的思路有点零散,咱们换个更清晰的方式来解这个题:
解法一:分状态递推法
我们可以把符合要求的6位数字串分成三类状态来统计:
- A(n):n位串全是0(既没有1也没有2),这类串显然符合要求,因为没有2需要约束
- B(n):n位串包含至少一个1,但没有2,这类串也符合要求,同样没有违反“2必须在1之后”的规则
- C(n):n位串包含至少一个1和至少一个2,且所有2都出现在1之后,完全符合题目约束
接下来我们逐个推导这三类的数量:
- A(n)的计算:不管n是多少,全0的串只有1种,所以
A(6) = 1 - B(n)的递推:
- 要得到n位的B类串,要么是在n-1位的全0串(A(n-1))末尾加一个1,要么是在n-1位的B类串末尾加0或1
- 递推公式:
B(n) = A(n-1) + 2*B(n-1) - 逐步计算到n=6:
- B(1)=1(串"1")
- B(2)=1 + 2*1=3(串"01","10","11")
- B(3)=1 + 2*3=7
- B(4)=1 + 2*7=15
- B(5)=1 + 2*15=31
- B(6)=1 + 2*31=63
- C(n)的递推:
- 要得到n位的C类串,要么是在n-1位的B类串末尾加一个2(第一次引入2,且在1之后),要么是在n-1位的C类串末尾加0、1、2(已经满足约束,加任何数字都不违反)
- 递推公式:
C(n) = B(n-1) + 3*C(n-1) - 逐步计算到n=6:
- C(1)=0(1位串不可能同时有1和2)
- C(2)=B(1) + 3*0=1(串"12")
- C(3)=B(2) + 3*1=3+3=6
- C(4)=B(3) + 3*6=7+18=25
- C(5)=B(4) + 3*25=15+75=90
- C(6)=B(5) + 3*90=31+270=301
最后把三类数量相加,得到符合要求的6位数字串总数:S(6) = A(6) + B(6) + C(6) = 1 + 63 + 301 = 365
解法二:总数量减去不符合条件的数量
我们先算所有由0、1、2组成的6位数字串总数:3^6 = 729
接下来找出不符合条件的串(即存在至少一个2出现在所有1之前,或者没有1但有2的串),分成两类:
- 没有1但有至少一个2的串:
- 这类串每个位置只能是0或2,总共有
2^6=64种,其中全0的1种是符合要求的,所以不符合的数量是64-1=63
- 这类串每个位置只能是0或2,总共有
- 有1和2,但所有2都在1之前的串:
- 我们考虑第一个1出现在第k位(k从2到6):
- 前k-1位只能是0和2,且至少有一个2,数量为
2^{k-1}-1 - 第k位是1,后面6-k位可以是0、1、2任意,数量为
3^{6-k}
- 前k-1位只能是0和2,且至少有一个2,数量为
- 把k从2到6的情况相加:
- k=2:
(2^1-1)*3^4 = 1*81=81 - k=3:
(2^2-1)*3^3=3*27=81 - k=4:
(2^3-1)*3^2=7*9=63 - k=5:
(2^4-1)*3^1=15*3=45 - k=6:
(2^5-1)*3^0=31*1=31
- k=2:
- 这类不符合的总数是
81+81+63+45+31=301
- 我们考虑第一个1出现在第k位(k从2到6):
把两类不符合的数量相加:63+301=364
最后用总数量减去不符合的数量,得到符合要求的串数:729-364=365
两种方法得到的结果一致,说明答案是对的!
内容的提问来源于stack exchange,提问作者MollyCooL
相关产品推荐
相关产品推荐

