Paint Fence(276)

Paint Fence

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

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

Return the total number of ways you can paint the fence.優化

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

思路: 注意題目的意思是不能超過兩個相鄰的顏色一致。 這種方案總數問題不少都是用dp。 由於超過相鄰兩個顏色一致,即不能三個顏色一致,那麼x的塗色不能和前一個一致|| 不能和前前個塗色一致。
即f[x] = f[x - 1] K - 1 + f[x - 2] k - 1; 除了遞推,還要考慮base 狀況。 若是n 或者k 任意一個爲0, 那麼f[x] = 0。 若是n == 1, 那麼就是k。 it

時間複雜度: O(n)
空間複雜度: O(n)io

public class Solution {
    public int numWays(int n, int k) {
        int[] f = new int[n + 1];
        if (n == 0 || k == 0) {
            return 0;
        }
        if (n == 1) {
            return k;
        }
        f[0] = k;
        f[1] = k * k;
        for (int i = 2; i < n; i++) {
            f[i] = f[i - 1] * (k - 1) + f[i - 2] * (k - 1);
        }
        return f[n - 1];
    }
}

空間改進:class

對於dp來講,爲了存儲狀態開闢的數組能夠變成動態數組來優化空間。 由於當前狀態僅僅只和上一個,還有上上個有關。因此實際只須要開闢3個空間。這樣空間複雜度降爲O(1).時間

public class Solution {
    public int numWays(int n, int k) {
        int[] f = new int[3];
        if (n == 0 || k == 0) {
            return 0;
        }
        if (n == 1) {
            return k;
        }
        f[0] = k;
        f[1] = k * k;
        for (int i = 2; i < n; i++) {
            f[i % 3] = f[(i - 1) % 3] * (k - 1) + f[(i - 2) % 3] * (k - 1);
        }
        return f[(n - 1) % 3];
    }
}
相關文章
相關標籤/搜索