染栅栏——Paint Fence

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

猜你喜欢

转载自www.cnblogs.com/liqiniuniu/p/10514836.html