276. Paint Fence

这题有歧义啊。。说的是颜色相同的相邻数量不能超过2个,不是颜色相同的对数不能超过2个,我日了。

搞懂之后就不难了,动态规划。

每一次粉刷都有2种可能,和前一个颜色相同;和前一个颜色不同。

same[i] = diff[i-1];  
diff[i] = (same[i-1]+diff[i-1]) * (k-1);

总和是same[n]+diff[n]..

然后,这种一维DP是不需要整个数组的,3个变量就够了,但是这么写更清楚。

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

}
posted @ 2016-10-07 06:44  哇呀呀..生气啦~  阅读(136)  评论(0)    收藏  举报