[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];
    }
}
相關文章
相關標籤/搜索