演算法學習之路 牆壁塗色

2021-09-21 02:59:12 字數 893 閱讀 7450

題目大意

蒜頭君覺得白色的牆面好單調,他決定給房間的牆面塗上顏色。他買了 33 種顏料分別是紅、黃、藍,然後把房間的牆壁豎直地劃分成 nn 個部分,蒜頭希望每個相鄰的部分顏色不能相同。他想知道一共有多少種給房間上色的方案。

例如,當 n=5n=5 時,下面就是一種合法方案。

由於牆壁是乙個環形,所以下面這個方案就是不合法的。

輸入格式

乙個整數 nn,表示房間被劃分成多少部分。(1≤n≤501≤n≤50)

輸出格式

乙個整數,表示給牆壁塗色的合法方案數。

樣例輸入

4樣例輸出

18dp[n]表示n塗色的合法方案數。(即每個相鄰顏色不相同且n和第乙個不相同)

1.當n-1和1處顏色不同時,那麼n處只能有一種選擇。那麼這種情況時,dp[n]=dp[n-1]

(n-1個合法方案中每一種都滿足情況1)

2.當n-1和1處顏色相同時,那麼n處有兩種選擇。

(這時,n-1與1顏色相同,這種情況共dp[n-2]種:n-2種合法方案後,麵再加乙個與1處的相同顏色n-1,就是情況2的方案數)

那麼,滿足一般條件n>3的狀態轉移方程為:

dp[i]=2*dp[i-2]+dp[i-1];

存在不滿足一般條件的特殊情況:(手算即可)

dp[0]=3;

dp[1]=6;

dp[2]=6;

#include#define ll long long//暴力的結果一般很大

using namespace std;

int main()

cout<

}

演算法學習之路

目錄 演算法學習之路 一 前言 一 書籍 二 學習內容 1.空間複雜度,時間複雜度 2.貪心演算法 總結 由於長期沉迷摸魚哲學,感覺自己已經快廢了,決定今天開始學習一些演算法資料充實自己,希望不要三分鐘熱度吧。使用的學習書籍是csdn中自帶的 趣學演算法 看過很多演算法的教學書籍了,開頭都是老面孔了...

演算法學習之路

第一階段 練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡 因為太常用,所以要練到寫時不用想,10 15 分鐘內打完,甚至關掉顯示器都可以把程式打 出來.1.最短路 floyd dijstra,bellmanford 2.最小生成樹 先寫個prim,kruscal要用並查集,不好寫...

演算法學習 區間dp 塗色PAINT

這是一道區間dp題,題目有小錯誤,字串的長度不是5,而是小於1005的長度。定義 f i j 為區間 i,j 需要塗色最少的次數 我們可以發現這樣一件事 我們塗色盡量從最兩端的顏色開始塗,雖然無從證明,但是對該題是正確的結論。假設字串為s,當區間 i,j 兩端顏色相同時,可以先把整段區間塗成該種顏色...