[Leetcode] Paint Fence 栅栏涂色

Paint Fence

There is a fence with n posts, each post can be painted with one of the k colors.post

You have to paint all the posts such that no more than two adjacent fence posts have the same color.code

Return the total number of ways you can paint the fence.it

Note: n and k are non-negative integers.io

哈希表法

复杂度

时间 O(N) 空间 O(1)class

思路

这种给定一个规则,计算有多少种结果的题目通常都是动态规划,由于咱们能够从这个规则中获得递推式。根据题意,不能有超过连续两根柱子是一个颜色,也就意味着第三根柱子要么根第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色。若是不是同一个颜色,计算可能性的时候就要去掉以前的颜色,也就是k-1种可能性。假设dp[1]是第一根柱子及以前涂色的可能性数量,dp[2]是第二根柱子及以前涂色的可能性数量,则dp[3]=(k-1)*dp[1] + (k-1)*dp[2]动态规划

递推式有了,下面再讨论下base状况,全部柱子中第一根涂色的方式有k中,第二根涂色的方式则是k*k,由于第二根柱子能够和第一根同样。时间

代码

public class Solution {
    public int numWays(int n, int k) {
        // 当n=0时返回0
        int dp[] = {0, k , k*k, 0};
        if(n <= 2){
            return dp[n];
        }
        for(int i = 2; i < n; i++){
            // 递推式:第三根柱子要么根第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色
            dp[3] = (k - 1) * (dp[1] + dp[2]);
            dp[1] = dp[2];
            dp[2] = dp[3];
        }
        return dp[3];
    }
}
相关文章
相关标签/搜索