1.题目描述
一个只包含’A’、’B’和’C’的字符串,如果存在某一段长度为3的连续子串中恰好’A’、’B’和’C’各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串”CBA”中包含了’A’,’B’,’C’各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含’A’,’B’,’C’,所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含’A’、’B’和’C’),有多少个是暗黑的字符串。
输入描述:
输入一个整数n,表示字符串长度(1 ≤ n ≤ 30)
- 1
输出描述:
输出一个整数表示有多少个暗黑字符串
- 1
示例1
输入
3
- 1
输出
21
思路:要想推出来f(n)与f(n-1)的关系,首先思考现在有两个字符在添加一个成为暗黑格子,有两种情况,
D(n-1)代表前两个字符是相等的,那么此时有三种情况ABC都可以,3*D(n-1)
S(n-1)代表前两个字符是不等的,那么此时有二种情况2*S(n-1)
故此时推出f(n)=3*D(n-1)+2*S(n-1) 又因为f(n-1)=S(n-1)+D(n-1)故此时f(n)=2*f(n-1)+D(n-1)
现在需要找出D(n-1)与f(n)之间的关系
当S(n-1)时,有两种情况,比如现在是AB 情况为ABA,ABB这两种,此时有1/2的情况是相同的,故为S(n-1)
当D(n-1)时,有三种情况,比如现在是AA 情况为AAB,AAC,AAA这三种,此时有1/3的情况是相同的,故为D(n-1)
S(n)=S(n-1)+2*D(n-1)
D(n)=S(n-1)+D(n-1)
有前面可知f(n)=S(n)+D(n)故可以推出 D(n)=f(n-1)
故f(n)=2*f(n-1)+f(n-2)
代码
#暗黑字符串 n=int(input("请输入n的值:")) dp=[i for i in range(n)] dp[0]=3 dp[1]=9 for i in range(2,n): dp[i]=2*dp[i-1]+dp[i-2]#推出来的公式 print(dp[n-1]) |