n
个柱子,现在要给柱子染色,有
k
种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
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
看第i个柱子有多少种染色方案:
我们用record[i]来存储第i个柱子有多少种染色方案
①与第i-1个柱子颜色相同,此时只要i-1与i-2个柱子颜色不同即可,所以此时方案的个数为:record[i-2]*(k-1)
②与第i-1个柱子颜色不同,此时只要与i-1不一样就好,所以此时的方案数为:record[i-1]*(k-1)
然后边界问题,当n=1时,方案数为k,当n=2时,方案数为k*k,当n>=3时,就可使用前面的转移方程了。
要注意,当k=1时,如果n>=3.则方案数为0
贴代码:
def numWays(self, n, k):
# write your code here
if n==0:
return 0
elif n<=2:
return k**n
p1=k
p2=k*k
for i in range(3,n+1):
if k==1:
return 0
else:
tmp=p2
p2=p1*(k-1)+p2*(k-1)
p1=tmp
return p2