LintCode 柵欄染色

2021-08-03 10:16:24 字數 1359 閱讀 8065

題目描述:我們有乙個柵欄,它有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 如果是不允許三根柱子相鄰...