有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。
你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。
注意:
n 和 k 均为非负的整数。
示例:
输入: n = 3,k = 2
输出: 6
解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有:
柱 1 柱 2 柱 3
----- ----- ----- -----
1 c1 c1 c2
2 c1 c2 c1
3 c1 c2 c2
4 c2 c1 c1
5 c2 c1 c2
6 c2 c2 c1
用dp[n]来代表涂完前n个栅栏的解。
先分类讨论一下:
1. 如果当前栅栏跟前一个栅栏涂一样的颜色,可能性有 dp[n - 2] * ( k - 1)
2. 如果当前栅栏跟前一个栅栏涂不一样的颜色,可能性有 dp[n - 1)] * (k - 1)
所以 dp[n] = (dp[n - 2] + dp[n - 1] )* (k - 1)
class Solution(object):
def numWays(self, n, k):
"""
:type n: int
:type k: int
:rtype: int
"""
dp = [0] * (n + 3)
dp[0], dp[1], dp[2] = 0, k, k * k
for i in range(3, n + 1):
dp[i] = dp[i - 1] * (k - 1) + dp[i - 2] * (k - 1)
return dp[n]