天天看點

算法學習之路|牆壁塗色

題目大意

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

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

算法學習之路|牆壁塗色

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

算法學習之路|牆壁塗色

輸入格式

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

輸出格式

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

樣例輸入

4

樣例輸出

18

dp[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;

繼續閱讀