lintcode练习 - 514. 栅栏染色

版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/81868597

514. 栅栏染色

我们有一个栅栏,它有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

注意事项

nk都是非负整数

解题思路:

只能相邻两个柱子相邻,第一个柱子为K种, 第二个柱子则为K*K种, 第三个柱子就存在颜色相同的情况了,

第三根柱子和前两个柱子的染色方式有关,要么和第一根颜色可以相同,要么可以和第二根颜色相同,不考虑颜色相同的情况时:dp[i] = (dp[i-1]+dp[i-2]) * k,排除掉颜色区别后,dp[i] = (dp[i-1]+dp[i-2]) * (k-1) 。

class Solution:
    """
    @param n: non-negative integer, n posts
    @param k: non-negative integer, k colors
    @return: an integer, the total number of ways
    """
    
    def numWays(self, n, k):
        # write your code here
        if n == 1:
            return k
        #只有两个相邻柱子颜色可以相同
        dp = [0] * n
        #第一根柱子有K种方法
        dp[0] = k
        #第二根柱子颜色可以和第一根柱子相同,所以有k*k种
        dp[1] = k*k
        #第三根柱子和前面两个柱子有关, 并且三根不能颜色一样,所以颜色要少一种
        for i in range(2, n):
            dp[i] = (dp[i-1]+dp[i-2])*(k-1)
        
        return dp[n-1]
    

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81868597
514