zoukankan      html  css  js  c++  java
  • 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))。

     优化代码:

    class Solution:
        """
        @param n: non-negative integer, n posts
        @param k: non-negative integer, k colors
        @return: an integer, the total number of ways
        """
        '''
        1.如果是0,1,2个柱子的话,染色方案可以直接得到
        2.如果是大于2个柱子的话,那么染色方案可以计算得到
        (1).如果要和上一个柱子染色相同的话,那么前两个柱子必须不同颜色,dic[-2]*(k-1)*1
        (2).如果要和上一个柱子染色不同的话,那么前两个柱子颜色相同和不相同均可。dic[-1]*(k-1)
        3.多少个柱子就循环多少次即可(从2开始)
        '''
        def numWays(self,n,k):
            ##如果是0,1,2个柱子的话,那么染色方案是固定的
            dic = [0,k,k**2]
    
            ##如果是大于2个柱子的话,那么根据规律来计算
            for i in range(2,n):
                dic.append(dic[-2]*(k-1)*1+dic[-1]*(k-1))
            return dic[n]

  • 相关阅读:
    js实现倒计时
    CSS解决ul下面最后一个li的margin
    js手动定时清除localStorage
    js应用中的小细节-时间戳的转换和input输入框有效数字
    javaScript将string转换成array,并将汉字按汉语拼音排序方法
    CSS3属性之text-overflow:ellipsis,指定多行文本中任意一行显示...
    移动端下拉刷新,向后台请求数据
    进程 线程 协程
    网络编程
    flask 2 进阶
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12484125.html
Copyright © 2011-2022 走看看