• 剑指Offer_10_矩形覆盖


    题目描述

    我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法?

    解题思路

    n个矩形可以横着放或者竖着放,则最后一块可以是横着放的或者,最后两个横着放
    可以得到公式$$f(n) = f(n-1) + f(n-2)$$,则该题与斐波那契数列是类似的,可以使用递归和循环来实现。

    实现

    1. 循环

    public class Solution {
        public int RectCover(int target) {
    		if(target == 0) return 1;
            if(target == 1) return 1;
            int fn_1 = 2, fn_2 = 1;
            int fn = fn_1;
            for(int i = 3; i <= target; i++){
                fn = fn_1 + fn_2;
                fn_2 = fn_1;
                fn_1 =fn;
            }
            return fn;
        }
    }
    

    2. 递归

    public class Solution {
        public int RectCover(int n) {
            if (n == 0) return 0;
            int[] dp = new int[n + 1];
            for (int i = 0 ; i < n + 1; i ++){
                dp[i] = -1;
            }
    
            dp[0] = 1;
            dp[1] = 1;
    
            return rectCover(n, dp);
        }
    
        private int rectCover(int n, int[] dp) {
            if (dp[n] >= 0) return dp[n];
            else{
                return dp[n] = rectCover(n - 1, dp) + rectCover(n - 2, dp);
            }
        }
    }
    
  • 相关阅读:
    前置++和后置++的区别
    snmp数据包分析
    [codeforces538E]Demiurges Play Again
    [codeforces538D]Weird Chess
    [BZOJ3772]精神污染
    [BZOJ4026]dC Loves Number Theory
    [BZOJ1878][SDOI2009]HH的项链
    [BZOJ3658]Jabberwocky
    [BZOJ3932][CQOI2015]任务查询系统
    [BZOJ3551][ONTAK2010]Peaks加强版
  • 原文地址:https://www.cnblogs.com/ggmfengyangdi/p/5764123.html
Copyright © 2020-2023  润新知