這是一題來自google的面試題,屬於easy類題,其中的解題思路是運用動態規劃的思想。
這種給定乙個規則,計算有多少種結果的題目一般都是動態規劃,因為我們可以從這個規則中得到遞推式。根據題意,不能有超過連續兩根柱子是乙個顏色,也就意味著第三根柱子要麼根第乙個柱子不是乙個顏色,要麼跟第二根柱子不是乙個顏色。如果不是同乙個顏色,計算可能性的時候就要去掉之前的顏色,也就是k-1種可能性。假設dp[1]是第一根柱子及之前塗色的可能性數量,dp[2]是第二根柱子及之前塗色的可能性數量,則dp[3]=(k-1)dp[1] + (k-1)dp[2]。
遞推式有了,下面再討論下base情況,所有柱子中第一根塗色的方式有k中,第二根塗色的方式則是k*k,因為第二根柱子可以和第一根一樣。
下面是c++**:
class solution ;
if (n <= 2)
return dp[n];
if (k == 1)
return 0;
for (int i = 3; i <= n; ++i)
return dp[3];}};
LintCode 柵欄染色
lintcode 柵欄染色 lintcode表述有問題,原文是 必須保證任意兩個相鄰的柱子顏色不同 應該表述為 至多有兩根相鄰的柱子具有相同的顏色 此題使用動態規劃,狀態轉移方程為f i f i 1 k 1 f i 2 k 1 顯然f 0 k,f 1 k k 方法一 class solution p...
514 柵欄染色
3.28 這個題自己的錯誤,廢了很多時間。如果是單純地相鄰不許同色的話,應該就是這樣的 public static int numways1 int n,int k if k 1 n 2 int x int math.pow k 1,n 1 return x k 2 n 1 如果是不允許三根柱子相鄰...
LintCode 柵欄染色
題目描述 我們有乙個柵欄,它有n個柱子,現在要給柱子染色,有k種顏色可以染。必須保證最多只有兩個相鄰的柱子顏色相同,求有多少種染色方案。樣例 n 3,k 2,return 6 post 1,post 2,post 3 way1 0 0 1 way2 0 1 0 way3 0 1 1 way4 1 0...