一个只包含'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)
输出一个整数表示有多少个暗黑字符串
2 3
9 21
while True: try: n=input() #print(n) n=int(n) #print(n) result=0 dp=[] for i in range(n+1): dp.append([0]) dp[0]=3 dp[1]=9 if n>2: for i in range(3,n+1): dp[i-1]=dp[i-3]+2*dp[i-2] #print(dp) result=dp[n-1] elif n==2: result=9 elif n==1: result=3 print(result) except: break
惭愧,刚开始居然没有反应过来要用动态规划,没弄懂题,看来还要练习
其他人的思路(很标准):
在第n位填和第n-1位或第n-2位一样的字母一定是暗黑串,此时种数是2a[n-1],而这些种数中多包含了一个重复的第n-1位和第n-2位一样的情况,第n-1位和第n-2位一样的种数显然位a[n-2],此时有2a[n-1]-a[n-2]种,但是当n-1位和n-2位一样的时候最后一位填什么都可以,前面已经计算过了和这两位一样的情况,因此还要加上其他两个字母的情况即2*a[n-2].
自己的思路(低智商观察法):
首先是个递进的问题,长n的黑暗字串只能在n-1上面添加字符诞生。而添加字符只用考虑长n-1字符串的最后两位。分为两种情况,不相同,有两种添加法,相同则有3种添加法。现在就是挑出相同的情况有多少种,很明显n-1中相同的来自n-2黑暗字串,而把n-2的黑暗字串全部添加和末尾相同的字符,一定还是黑暗字串,所以n-1的尾巴相同的黑暗字串和n-2黑暗字串数量相同。所以f(n)=2f(n-1)+f(n-2).
N = int(input())
ans = [0 for i in range(31)]
ans[1] = 3
ans[2] = 9
for i in range(3,31):
ans[i] = ans[i-1]*2+ans[i-2]
print(ans[N])
n = int(raw_input()) if n == 1: print 3 else: # initialization, aa-type:3, ab-type:6 ans = [3, 6] mat = [[1, 1], [2, 1]] temp_ans = [0, 0] temp = [[0, 0], [0, 0]] # number of interation n = n - 2 while n != 0: if n & 1 == 1: # update ans temp_ans[0] = mat[0][0] * ans[0] + mat[0][1] * ans[1] temp_ans[1] = mat[1][0] * ans[0] + mat[1][1] * ans[1] ans[0] = temp_ans[0] ans[1] = temp_ans[1] # update the matrix temp[0][0] = mat[0][0] * mat[0][0] + mat[0][1] * mat[1][0] temp[0][1] = mat[0][0] * mat[0][1] + mat[0][1] * mat[1][1] temp[1][0] = mat[1][0] * mat[0][0] + mat[1][1] * mat[1][0] temp[1][1] = mat[1][0] * mat[0][1] + mat[1][1] * mat[1][1] # assign temp back to mat mat[0][0] = temp[0][0] mat[1][0] = temp[1][0] mat[0][1] = temp[0][1] mat[1][1] = temp[1][1] n = n >> 1 print ans[0] + ans[1]