題目:
乙個只包含』a』、』b』、』c』的字串,如果存在一段長度為3的連續子串中,恰好有』a』、』b』、』c』各有乙個,那麼這個字串就是純淨字串,否則這個字串是暗黑的。
例如:baacaaccbaaa這個字串就是暗黑的。例如:
baacaaccbaaa這個字串就是純淨的,因為其連續子串中包含了』c』、』b』、』a』各乙個。
你的任務就是計算出長度為n的字串(包含』a』、』b』、』c』),有多少個是暗黑的字串。
比如輸入:
2 3
輸出:
9 21
分析:
說實話,一開始沒怎麼看懂題目意思。再仔細看求長度為n的字串,有多少個暗黑字串。而相對的純淨字串是連續為3的字串中,分別有abc三個不同的字元。
因此理解:
n=1的時候,一定有 a、b、c三種
n=2的時候,有aa,ab,ac,ba,bb,bc,ca,cb,cc 這九種。
n=3的時候,可以用 3^3 - (abc的全排列) = 21
那n=4的時候呢? 就必須具體分析,得到相應的規律。
當字串為n的時候:
f(n) 表示暗黑字串的個數。
s(n) 表示最後兩位相同的黑暗字串個數
d(n)表示最後兩位不同的暗黑字串個數
得出 f(n) =s(n)+d(n)
繼續考慮f(n)與f(n-1)的關係,才能得出遞推式
s(n-1)的後兩位一定是相同的,因此新加入的一位可以是abc任意乙個!!
如 ***aa ,由於s(n-1)本身已經是暗黑字串,就不用考慮前面了,只需要考慮最後兩位,再加入一位使得字串依舊是暗黑字串,***aab, ***aaa,***aac 有三種情況d(n-1)的後兩位是不同的,因此新加入的一位,一定要是後兩位其中之一
如 ***ab, 要保證加入一位依然是暗黑字串,那麼只能選擇前面的兩位之一 ***aba, ***abb 兩種情況
f
(n) = 3s
(n-1)+2d
(n-1) = 2f
(n-1)+s
(n-1)
繼續分析,s(n-1) 表示後兩位相同,因此等同於 s(n-1) 只有後一位,因此等於f(n-2).
f
(n) = 2f
(n-1)+f
(n-2)
**如下:
public
static
void
main(string args)
int n = 0;
while(scanner.hasnext())
}
網易0912 暗黑字串
題目的大意 乙個字串只能由 a b c 三個字母組合而成 若在字串中如果 a b c 三個字元任意組合出現,則此字串為清澈的,否則為黑暗的。如 aabbccabaa 因為包含 cab 所以是清澈的 aabbccbcbba 則是黑暗的。輸入 字串的長度n 1 n 30 輸出 包含的黑暗字串的個數 樣例...
動態規劃(一)暗黑字串
1.題目描述 輸入乙個整數n,表示字串長度 1 n 30 輸出乙個整數表示有多少個暗黑字串321思路 要想推出來f n 與f n 1 的關係,首先思考現在有兩個字元在新增乙個成為暗黑格仔,有兩種情況,d n 1 代表前兩個字元是相等的,那麼此時有三種情況abc都可以,3 d n 1 s n 1 代表...
求解暗黑字串(網易2017秋招)
問題描述 乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb 不存在乙個長度為3的...