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時輸入字元後按回車結...