版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击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
注意事项
n
和k
都是非负整数
解题思路:
只能相邻两个柱子相邻,第一个柱子为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]