DP入門題目 不能有兩個連續的字元「A」

2021-08-14 21:37:47 字數 783 閱讀 4565

abc三個字母組成長度為n的字串(1<=n<=100000),要求這個字串不能有兩個或兩個以上連續的a。請問共有多少種符合條件的字串?

輸入樣例:

1輸出樣例:

3輸入樣例:

2輸出樣例:

8輸入樣例:

3輸出樣例:

22

這個題目是2023年12月份,在沈航的校賽上遇到的。具體的題目我記不清了,這個是當時題目的大概意思。因為是英文題目,開始的時候翻譯有偏差(滑稽),翻譯的是不能有兩個以上的a。。。然後就從排列組合入手了。。後來wa了兩次之後發現是不能有連續a

後乙個字元可以是哪個,是由前乙個字元決定的

(前乙個字元是a,則後乙個字元不能是a;前乙個字元不是a,則後乙個字元不受限)

。(好吧我承認,我是在手動暴力的時候發現的)

自然也就有了dp解法咯。。。

狀態轉移方程:

dp[n][0] = (dp[n-1][0] + dp[n-1][1]) * 2;//第n個字元如果不是a(是b或者c兩種可能,所以*2),則第n-1個字元能是a也能不是a

dp[n][1] = dp[n-1][0];//第n個字元如果是a,則第n-1個字元不能是a

有了狀態轉移方程,這個題目自然就解決啦!

#include using namespace std;

int dp[100000][2];

int main()

cout<

dp入門與兩個基礎的揹包問題

引子 第乙個問題 現在有3種硬幣,1角錢,2角錢,3角錢,那麼問題來了湊出n角錢最少需要多少硬幣。這個問題可以用貪心法解決。如果n比3大,那麼一直取3就好了。最後少的要麼是2,要麼是1,所以答案是n 3 n 3 1 0 第二個問題 現在有3種硬幣,2角錢,3角錢,5角錢,那麼問題來了湊出n角錢最少需...

兩個約束下的dp問題

洛谷p1510 分析 本質上還是乙個01揹包,將體力當做重量,體積當做價值。配上滾動陣列 即dp j 代表在體力耗費為j時最大能搬運多少體積的石頭,當dp j v時就說明存在滿足情況的解,這樣,就選擇最小的j就可以了 includeusing namespace std typedef long l...

連續兩個scanf()時,可能出現的錯誤

include int main 表面上看這段程式是沒有錯的,也可以執行,但執行過程中到第二個scanf輸入值給ch2時,程式不會停止,而是直接執行到最後乙個printf 原來scanf是從標準輸入緩衝區中讀取輸入的資料,而 c的字元輸入格式會接收回車字元,在輸入第乙個scanf時輸入字元後按回車結...