題目描述:我們有乙個柵欄,它有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 0
way5 1 0 1
way6 1 1 0
動態規劃求解:
用dp[i]儲存染i個柱子的染色方案。dp[1]=k。dp[2]=k*k。
染第i個柱子時,和前面兩個柱子相關.
前面2個柱子中,即第i-1,第i-2個柱子,設顏色相同的組有x組,顏色不同的組有dp[i-1]-x組。那麼dp[i]=x*(k-1)+(dp[i-1]-x)*k.
如何計算第i-1,第i-2個柱子中,有多少顏色相同組,有如下:第1,2個柱子中不重複的等於第2,3個柱子中重複的組數。一般來說,就是第i-3,i-2個柱子中不重複的等於第i-1,第i-2個柱子中重複的組數。
第1,2個柱子中,重複的有k組,設x=k。
對於第3根及之後的柱子,計算dp[i]只需dp[i-1],x。所以無需使用列表,只用2個變數即可。貼出**如下:
def
numways
(self, n, k):
if n==0
or k==0:
return
0elif n==1:
return k
elif k==1
and n>2: #此句排除了只有一種顏色的可能
return
0 x=k #第i-1,i-2個柱子中重複的組數
a=k*k #只用變數即可,a表示dp[i-1],此處a初始化為dp[2]
for i in range(3,n+1):
b=(a-x)*k+x*(k-1) #計算dp[i]
x=a-x #更新x,用於下次計算
a=b #更新dp[i-1],用於下次計算
return a
這段**在lintcode上提交的時候,有個問題,有一組資料,n=1367485(乙個很大的數),k=1,提交之後說超出記憶體限制,然後為了排除這個問題,加上了上段**中的下面這句。
elif k==1
and n>2: #此句排除了只有一種顏色的可能
return
0
還沒搞清楚是什麼原因。
另一種來自於別人的答案,就沒有這種問題,看起來也比上一種好理解一些,見下面:
你看看別人家的孩子%>_<%
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...
lintcode 柵欄染色
我們有乙個柵欄,它有n個柱子,現在要給柱子染色,有k種顏色可以染。必須保證不存在超過2個相鄰的柱子顏色相同,求有多少種染色方案。注意事項 n和k都是非負整數 您在真實的面試中是否遇到過這個題?yes 樣例n 3,k 2,return6 post 1,post 2,post 3 way1 0 0 1 ...
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 如果是不允許三根柱子相鄰...