剑指OFFER之矩形覆盖(九度OJ1390)

题目描述:




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


输入:



输入可能包含多个测试样例,对于每个测试案例,

输入包括一个整数n(1<=n<=70),其中n为偶数。


输出:



对应每个测试案例,

输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。


样例输入:



4

样例输出:



5

解题思路:



  观察题目中的矩形,2*n的,是个长条形。本来脑中想象的是复杂的华容道,但是既然只是简单的长条形,那么依然逆向分析。既然是长条形的,那么从后向前,最后一个矩形2*2的,只有两种情况:


   第一种是最后是由一个2*(n-1)的矩形加上一个竖着的2*1的矩形

  另一种是由一个2*(n-2)的矩形,加上两个横着的2*1的矩形

  因此我们可以得出,

  第2*n个矩形的覆盖方法等于第2*(n-1)加上第2*(n-2)的方法。使用代码可以表示为:

for(i=3;i<71;i++){
arr[i] = arr[i-1]+arr[i-2];
}

  仍然要注意数据类型,为long
long型

代码:


#include <stdio.h>
long long arr[71] = {0,1,2};
void createArr(void){
int i;
for(i=3;i<71;i++){
arr[i] = arr[i-1]+arr[i-2];
}
}
int main(void){
int n;
createArr();
while(scanf("%d",&n) != EOF && n>=1 && n<=70){
printf("%lld\n",arr[n]);
}
return 0;
}
/**************************************************************
Problem: 1390
User: xhalo
Language: C
Result: Accepted
Time:0 ms
Memory:916 kb
****************************************************************/

剑指OFFER之矩形覆盖(九度OJ1390),布布扣,bubuko.com

时间: 2024-10-27 00:19:16

剑指OFFER之矩形覆盖(九度OJ1390)的相关文章

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指Offer:矩形覆盖【N1】

剑指Offer:矩形覆盖[N1] 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题目思考 我们先把2*8的覆盖方法记为f(8),用一个2*1的小矩形去覆盖大矩形的最右边时有两种选择,横着放或者竖着放, 此时左边的空间为f(6)或f(7),那么f(8)的放置结果为f(6)[右边横着放]+f(7)[右边竖着放] 找规律 f(n)=f(n-1)+f(n-2),斐波那契数列 Java题解 public clas

【剑指Offer】矩形覆盖

问题描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形. 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形, 总共有多少种方法? 解题思路 n=1 - 只有横放一个矩形一种解决办法 n=2 - 有横放一个矩形,竖放两个矩形两种解决办法 n=3 - n=2的基础上加1个横向,n=1的基础上加2个竖向 n=4 - n=3的基础上加1个横向,n=2的基础上加2个竖向 · · · n=n - n = f(n-1) + f(n-2) 斐波那契数列变种..... 代码实现 class Solu

剑指offer 10矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法 java版本: public class Solution { public static void main(String[] args){ long startTime=System.currentTimeMillis(); System.out.println("第23项的结果是:"+RectCover(23)); long endTime=System

剑指offer:矩形覆盖

题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: """ 如果number == 1,那么只有1种 即 f(1) == 1 f(2) == 2 ... f(n) = f(n-1) + f(n-2) 因此跟斐波那契数列是一样的,可用递归也可用循环求解 """ def rectCover(self, number): if number

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

剑指offer得意之作——顺时针打印矩阵

题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 分析: 这题是牛客网剑指offer的第十九题.顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印.同样 只包含一列时,要判断从上向下打