• 动态规划-计数-514. 栅栏染色


    2020-04-27 21:15:58

    问题描述:

    我们有一个栅栏,它有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都是非负整数

    问题求解:

    按最后两个柱子颜色是否相同进行划分。

    若最后两个颜色不同共(k - 1) * dp[i - 1]种,若最后两个颜色相同共(k - 1) * dp[i - 2]种。

    时间复杂度:O(n)

        public int numWays(int n, int k) {
            if (n == 1) return k;
            if (n == 2) return k * k;
            int[] dp = new int[n + 1];
            dp[1] = k;
            dp[2] = k * k;
            for (int i = 3; i <= n; i++) dp[i] = (k - 1) * dp[i - 2] + (k - 1) * dp[i - 1];
            return dp[n];
        }
    

      

  • 相关阅读:
    Codeforces 570E
    Codeforces 570D
    Codeforces 1136E
    Codeforces 570
    小白学习sprint boot容易遇到了一些问题
    力扣 234. 回文链表
    力扣198. 打家劫舍
    力扣543. 二叉树的直径
    力扣141.环形链表
    剑指offer1.跳台阶 & 力扣70.爬楼梯
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12790230.html
Copyright © 2020-2023  润新知