zoukankan      html  css  js  c++  java
  • Leetcode: 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.
    
    Return the total number of ways you can paint the fence.
    
    Note:
    n and k are non-negative integers.

    这种给定一个规则,计算有多少种结果的题目一般都是动态规划,因为我们可以从这个规则中得到递推式。根据题意,不能有超过连续两根柱子是一个颜色,也就意味着第三根柱子要么根第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色。如果不是同一个颜色,计算可能性的时候就要去掉之前的颜色,也就是k-1种可能性。假设dp[1]是第一根柱子及之前涂色的可能性数量,dp[2]是第二根柱子及之前涂色的可能性数量,则dp[3]=(k-1)*dp[1] + (k-1)*dp[2]

    另一种理解是第三根柱子只有两种选择:跟第二根一个颜色dp[1]*(k-1),跟第二根不同颜色dp[2]*(k-1), 这两种情况是不互相包含的,是独立的,举个栗子:

    假设第一根柱子有Y,R两种涂色方案(dp[1]=2),第二根有YY,YR,RY,RR四种涂色方案(dp[2]=4). 第三根若跟第二根同一颜色有YRR, RYY2种((2-1)*dp[1]),若跟第二根不同颜色有YYR,YRY,RYR,RRY4种((2-1)*dp[2])

    递推式有了,下面再讨论下base情况,所有柱子中第一根涂色的方式有k中,第二根涂色的方式则是k*k,因为第二根柱子可以和第一根一样。

     1 public class Solution {
     2     public int numWays(int n, int k) {
     3         // 当n=0时返回0
     4         int dp[] = {0, k , k*k, 0};
     5         if(n <= 2){
     6             return dp[n];
     7         }
     8         for(int i = 3; i <= n; i++){
     9             // 递推式:第三根柱子要么根第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色
    10             dp[3] = (k - 1) * (dp[1] + dp[2]);
    11             dp[1] = dp[2];
    12             dp[2] = dp[3];
    13         }
    14         return dp[3];
    15     }
    16 }

     用一维数组

     1 public class Solution {
     2     public int numWays(int n, int k) {
     3         if(n==0 || k==0) return 0;
     4         int[] dp = new int[n+1];
     5         dp[0] = 0;
     6         dp[1] = k;
     7         if (n == 1) return dp[1];
     8         dp[2] = k*k;
     9         if (n == 2) return dp[2];
    10         for (int i=3; i<=n; i++) {
    11             dp[i] = dp[i-1]*(k-1) + dp[i-2]*(k-1);
    12         }
    13         return dp[n];
    14     }
    15 }
  • 相关阅读:
    A*算法(八数码问题)
    【第一篇:C++与opencv】图片的读取和显示
    iOS事件拦截(实现触摸任意位置隐藏指定view)
    tableview随笔
    解决UITableView中Cell重用机制导致内容出错的方法总结
    iOS 数据类型转换
    git Xcode
    ios 读取各种类型文件
    iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
    iOS学习之NSBundle介绍和使用
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5074815.html
Copyright © 2011-2022 走看看