动态规划-计数-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];
    }

  

 

posted @ 2020-04-27 21:19  hyserendipity  阅读(313)  评论(0编辑  收藏  举报