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]

 

posted on 2018-03-27 17:43  usp10  阅读(131)  评论(0编辑  收藏  举报

导航