zoukankan      html  css  js  c++  java
  • 276. Paint Fence

         
        /*
         * 276. Paint Fence
         * 2016-6-26 by Mingyang
         * 上次paint了house,这次paint fence,因为我们这里的条件是最多连续两个有相同的颜色
         * 那么这里就稍稍复杂了那么一丢丢:
         * 设S(n)表示当前杆和前一个杆颜色相同的个数,D(n)表示当前杆和前一个颜色不相同的个数。
         * 则递推关系式为:
         * S(n) = D(n - 1), 即若当前杆和前一个杆颜色相同的个数等于前一个杆和再前一个杆颜色不相同的个数。
         * D(n) = (k - 1) * (D(n - 1) + S(n - 1)),即前一个杆和再前一个杆所有可能的颜色组合,
         * 乘以当前杆与前一个杆颜色不相同的个数,即(k - 1)。用两个变量记录D和S,并交替更新即可。
         * -------------这里需要注意所有情况:
         * 1.当前杆和前一个杆颜色相同S(n) = D(n - 1)
         * 2.当前杆和前一个颜色不相同D(n) = (k - 1) * (D(n - 1) + S(n - 1))
         */
        public int numWays(int n, int k) {
            if (n == 0 || k == 0) return 0;
            if (n == 1) return k;
            // same[i] means the ith post has the same color with the (i-1)th post.
            int[] same = new int[n];
            // diff[i] means the ith post has a different color with the (i-1)th post.
            int[] diff = new int[n];
            same[0] = same[1] = k;
            diff[0] = k;
            diff[1] = k * (k - 1);
            for (int i = 2; i < n; ++i) {
                same[i] = diff[i-1];
                diff[i] = (k - 1) * same[i-1] + (k - 1) * diff[i-1];
            }
            return same[n-1] + diff[n-1];
        }
    
    
    
    
    
  • 相关阅读:
    数组集合之间的转换
    eclipse 大小写转换
    Linux下查看文件内容的命令
    linux常用命令:创建文件和文件夹
    Error Downloading Packages: yum更新出现错误
    XShell上传文件到Linux服务器上
    linux最常用的20个命令
    Sonar理论篇
    如何查看DLL文件的函数列表
    C++在C的基础上的扩充
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5619063.html
Copyright © 2011-2022 走看看