演算法題 暗黑的字串

2021-08-01 22:38:14 字數 1770 閱讀 2563

乙個只包含』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

遞迴**如下:

#include 

#include

#include

#include

#include

using

namespace

std;

#define debug 0

long

long func(vector

str,int n)

long

long result(0);

if (str.size()==0)

, n);

result += func(vector

, n);

result += func(vector

, n);

}else

if ((*iter_left) + (*iter_right) + 'b' != sum)

if ((*iter_left) + (*iter_right) + 'e' != sum)

}return result;

}int main()

else

vector

str;

cout

<<3*func(str,n)0;}

兩種狀態的轉移情況如下:s(i)狀態新增的字元與最後兩字元相等時,轉化為s(i+1)狀態,否則轉化為d(i+1)狀態;d(i)狀態新增的字元與其最後字元相等時,轉化為s(i)狀態,與其倒數第二個字元相等時,轉化為d(i+1)狀態。狀態轉移方程如下:

s(n+1)=s(n)+d(n)

d(n+1)=2*s(n)+d(n)

注意:數字過大,需要long long型別防止溢位

#include 

#include

#include

#include

#include

using

namespace

std;

#define debug 0

long

long func(int n)

if (n==2)

long

long s = 3, d = 6, s, d;

for (auto k = 3; k <= n;++k)

return s + d;

}int main()

else

cout

0; }

程式設計題 暗黑的字串

乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb 不存在乙個長度為3的連續子串包...

暗黑的字串

題目描述 乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb 不存在乙個長度為3的...

暗黑的字串

乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb 不存在乙個長度為3的連續子串包...