【题目】
一个只包含'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
树形dp . 不妨记dp[i][0]表示字符串长度为i时,第i位和第i-1位数字相同时的暗黑字符串个数 ,dp[i][1]表示字符串长度为i时,第i位和第i-1位数字不同时的暗黑字符串个数
则递推公式如下:
dp[i][0] = dp[i-1][0] + dp[i-1][1]; (1)
dp[i][1] = 2*dp[i-1][0] + dp[i-1][1]; (2)
初始条件为:
dp[2][0] = 3;
dp[2][1] = 6;
【代码如下】
#include <iostream>
using namespace std;
#define N 150
long long dp[N][2];
int main()
{
int n = 1;
cin >> n;
dp[2][0] = 3;
dp[2][1] = 6;
for (int i = 3; i <= 30; i++)
{
dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
dp[i][1] = 2 * dp[i - 1][0] + dp[i - 1][1];
}
if (n == 1)
cout << "3" << endl;
else
cout << dp[n][0] + dp[n][1] << endl;
return 0;
}