我们有一个栅栏,它有n
个柱子,现在要给柱子染色,有k
种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
1 class Solution: 2 """ 3 @param n: non-negative integer, n posts 4 @param k: non-negative integer, k colors 5 @return: an integer, the total number of ways 6 """ 7 8 def numWays(self, n, k): 9 if n == 0: 10 return 1 11 if k == 0: 12 return 0 13 14 # 状态1:可以和前面的颜色相同,也可以不同 15 # 状态2:不可以和前面的相同 16 # 状态0:染第一个栅栏时,有k种染法,然后转向状态1 17 18 # dp1[remain]还剩下remain个栅栏要染,当前的栅栏可以和前面的相同。在这种情况下有多少种染法 19 # dp2[remain]还剩下remain个栅栏要染,当前的栅栏不可以和前面的相同。在这种情况下有多少种染法 20 21 dp1 = [0 for i in range(n)] 22 dp2 = [0 for i in range(n)] 23 24 dp1[0], dp2[0] = 1, 1 25 for remain in range(1, n): 26 27 # 当前栅栏可以和前面相同,也可以不同 28 # 若相同,则当前栅栏一种染法,之后转向状态2 29 # 若不同,则当前栅栏有k-1种染法,之后仍然是状态1 30 dp1[remain] = dp2[remain - 1] + (k - 1) * dp1[remain - 1] 31 32 # 当前栅栏一定不能和前面一样,所以当前栅栏有k-1种染发,之后,剩下remain-1个栅栏,转向状态1 33 dp2[remain] = (k - 1) * dp1[remain - 1] 34 return k * dp1[n - 1] 35 36