514.栅栏染色

514. 栅栏染色

中文 English

我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。

样例

例 1:

输入: n=3, k=2  
输出: 6
Explanation:
          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

例 2:

输入: n=2, k=2  
输出: 4
Explanation:
          post 1,   post 2
    way1    0         0       
    way2    0         1            
    way3    1         0          
    way4    1         1       

注意事项

nk都是非负整数

输入测试数据 (每行一个参数) 如何理解测试数据?
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
        dic = [0,k,k**2]
        print(dic)
        if n in [0,1,2]: return dic[n] print(dic) ##否则 for n in range(2,n): ##从第三个柱子开始,之后的柱子分为和上一个柱子颜色相同和不同的部分 ##如果是相同的部分的话,那么必须保证当前柱子的当前柱子的前两个是不同的颜色,才可以。>>>>>>dic[-2]*(k-1) 特别注意:当前柱子前两个相同的方案有dic[-2]*k种 ##如果是不同的部分的话,很容易理解,只需要*(k-1)即可>>上一个柱子的方案*(k-1)即为当前柱子不同的方案数量 res =dic[-2]*(k-1)+dic[-1]*(k-1) dic.append(res) return dic[-1]

大致解释:(可以基本判断柱子为0,1,2的时候染色的方案总数,柱子数量大于2之后的可以依次推导出来)

1.当柱子数量为0,1,2的时候,k随便,染色的方案数量分别为0,k,k**2(注意,相邻柱子是最多只能两个颜色相同,所以不是k*(k-1))

2.当柱子数量大于2的时候,此时分别和上一个柱子颜色相同和不同两种方向

(1).如果是和上一个柱子颜色相同,此时必须保证当前柱子的前两个柱子的颜色不同,才能和上一个柱子颜色相同。前两个柱子颜色不同的方案数量是:dic[-2]*(k-1)。注意:dic[-2]为前两个柱子染色方案总数,前两个柱子染色颜色相同的数量为dic[-2]*1

(2).如果是和上一个柱子颜色不同,此时很好理解,这就是dic[-1]*(k-1)就是结果了

3.柱子大于2的染色方案数量依次类推就好了,dic[-1]*(k-1)+dic[-2]*(k-1),即for n in range(2,n):dic.append(dic[-1]*(k-1)+dic[-2]*(k-1))。

猜你喜欢

转载自www.cnblogs.com/yunxintryyoubest/p/12484125.html
514