首页 > 代码库 > 动态规划: 套路之推导公式 黑暗字符串 牛客

动态规划: 套路之推导公式 黑暗字符串 牛客

[编程题] 暗黑的字符串

一个只包含‘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

 

解题思路:

  以为找规律,其实也是一种动态规划.而且还是一种典型的数论动态规划.

  假设: 长度为n的字符串. 通过前面n-1长度的字符串来推到.

假设:
    f(n - 1) = S(n - 1) + D(n - 1);
f:表示n-1长的黑暗字符串数 , S:表示n-1长的黑串结果中后两位相同的数目 D:后两位不同的数目;
为啥这么设,从n-1开始设方程,是为了通过f(n-1)来表示f(n)

观察变化过程:
1.S: eg:"AA" -> 增加1位结果:AAA AAB AAC 2.D: eg:"AB" -> 增加1位结果:ABA ABB target. f(n) = 3*S(n - 1) + 2*D(n - 1) = 2*f(n - 1) + S(n - 1); 发现S(n - 1)并不知道, 我们就在往前看一步,试着找出 f(n - 2)与 S(n - 1)之间的关系.好吧,其实一开始并不知道与谁的关系 总之要找S与别的变量的关系.

推导: 依据假设,有:f(n
- 1) = S(n - 1) + D(n - 1); 3.每个S(n - 1)都能够得到3个结果,根据1.知 其中的一个 是 S状态的(S(n))AAA 4.每个D(n - 1)都能够得到2个结果,根据2.知 其中的一个 是 S状态的(S(n))ABB 根据 3. 4. 得到: 5. S(n) = S(n - 1) + D(n - 1); 根据假设5. 可以得到 f(n - 1) = S(n) 推到得到: S(n - 1) = f( n - 2 ); 带入 target.得到 f(n) = 2*f(n - 1) + f(n - 2);

 

 

 

动态规划: 套路之推导公式 黑暗字符串 牛客