1. 程式人生 > >lintcode 柵欄染色

lintcode 柵欄染色

我們有一個柵欄,它有n個柱子,現在要給柱子染色,有k種顏色可以染。
必須保證不存在超過2個相鄰的柱子顏色相同,求有多少種染色方案。

 注意事項

nk都是非負整數

您在真實的面試中是否遇到過這個題?  Yes 樣例

n = 3, k = 2, return6

      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

這應該也是典型的動態規劃問題吧,我們從最後的情況開始討論。可以分為兩種情況:1.最後兩根柱子顏色相同2.最後兩根柱子顏色不同

對於第一種情況,最後兩根柱子顏色相同,不能三根柱子顏色連續相同,所以最後兩根柱子的顏色選擇有k-1種.

對於第二種情況,最後兩根柱子顏色不同,那麼最後一根柱子的顏色有k-1種選擇方案.

class Solution {
public:
    /*
     * @param n: non-negative integer, n posts
     * @param k: non-negative integer, k colors
     * @return: an integer, the total number of ways
     */
    int numWays(int n, int k) {
        // write your code here
      if (n == 0) return 0;
        if (n == 1) return k;
        if (n == 2)  return k*k;
        int d = k;
        int dp = k*k;
        for (int i = 3; i <= n; i++)
        {
            int dps = dp;
            dp = (d+dp) * (k-1);
            d = dps;
        }
        return dp;

    }
};