514. 栅栏染色
题解
这题目我一直理解为所有柱子中间不存在超过3个同颜色柱子连在一起,也就是全部柱子里最多就某2个颜色相同的,我就想这题目怎么做呀。。。怎么就dp呢?完全无法推倒。后面看别人题解才发现原来是不存在连续3个相同颜色的,也就是说可以很多个相同颜色的,这样的话还可以推导,但此时我已经看答案了,所以也不知道自己能不能推了,估计也是不能的。
当一个柱子时,有k种方法
当二个柱子时,有k*k种
当三个柱子时,他可能和前面颜色一样,也可能不一样
当和前面颜色一样时候,也就是和第一根柱子不一样,所以是dp[1]*(k-1)
当和前面不一样的时候,就和第一根没关系,只要和第二根不同就可以,dp[2]*(k-1)
得出第三根的方案有dp[1]*(k-1)+dp[2]*(k-1),此时推到公式为book[i] = book[i-2]*(k-1)+book[k-1]*(k-1)
特殊判断一些条件,例如前2个,和只有一种颜色的情况
def numWays(self, n, k): import math if n == 0 or k == 0: return 0 if k == 1 and n > 2: return 0 lst = [k, k*k] for i in range(2, n): lst.append(lst[i-2]*(k-1) + lst[i-1]*(k-1)) return lst[n-1]