zoukankan      html  css  js  c++  java
  • [LeetCode#276] Paint Fence

    Problem:

    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. 

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

    Note:
    n and k are non-negative integers.

    Wrong Solution:

    public class Solution {
        public int numWays(int n, int k) {
            if (n == 0 || k == 0)
                return 0;
            if (n == 1)
                return k;
            int total = k;
            int count = 1;
            while (count < k) {
                total *= k - 1;
                count++;
            }
            return total;
        }
    }

    Mistake Analysis:

    Fail to throughly understand problem!!! The problem asks us to compute the number of ways for arranging the painting which has no more than two sussive post share the same color. It means we were allowed to make two neighboring posts share the same color!

    Analysis:

    The problem of asking how many ways to do something is usually very easy!
    And it could always be solved through dynamic programming. You just need to carefully design the transitional function acoording to characteristics or certain restrictions. 
    
    We know for each post, it could differ or same as its previous post's color.
    Assume: 
    differ_count: represents the current post with different color with its previous post(the painting ways)
    same_count: represents the current post share the same color with its previous post(the painiting ways)
    
    We could have following trasitinao function
    differ_count(i) = differ_count(i-1) * (k-1) + same_count(i-1) * (k-1)
    same_count(i) = differ_count(i-1) //cause the current post must have the same color with post i-1, thus we could only use the way that differ_count(i-1)
    
    Base case:
    2 is a perfect base case for use to start, since it has simple same_count and differ_count;

    Solution:

    public class Solution {
        public int numWays(int n, int k) {
            if (n == 0 || k == 0)
                return 0;
            if (n == 1)
                return k;
            int same_count = k;
            int differ_count = k * (k - 1);
            for (int i = 3; i <= n; i++) {
                int temp = differ_count;
                differ_count = differ_count * (k - 1) + same_count * (k - 1);
                same_count = temp;
            }
            return same_count + differ_count;
        }
    }
  • 相关阅读:
    定义全局时间过滤器
    vue局部过滤器和全局过滤器
    vue-ref指令
    vue进行代码排序
    vue-通过name进行数据过滤
    将vue文档下载到本地预览
    由于vue的for循环id并不严谨,提高id严谨性
    vue指令v-for报错:Elements in iteration expect to have 'v-bind:key' directives.eslint-plugin-vue
    FlowPortal BPM历史版本升级说明
    102从 Outlook 中将电子邮件、联系人和日历导出到 .pst 文件
  • 原文地址:https://www.cnblogs.com/airwindow/p/4796688.html
Copyright © 2011-2022 走看看