前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指OFFER之矩形覆盖(九度OJ1390)

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

作者头像
用户1154259
发布2018-01-17 19:17:10
6100
发布2018-01-17 19:17:10
举报

题目描述:

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

输入:

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

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

输出:

对应每个测试案例,

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

样例输入:

代码语言:javascript
复制
4

样例输出:

5

解题思路:

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

第一种是最后是由一个2*(n-1)的矩形加上一个竖着的2*1的矩形  另一种是由一个2*(n-2)的矩形,加上两个横着的2*1的矩形  因此我们可以得出,第2*n个矩形的覆盖方法等于第2*(n-1)加上第2*(n-2)的方法。使用代码可以表示为:

代码语言:javascript
复制
for(i=3;i<71;i++){
        arr[i] = arr[i-1]+arr[i-2];
    }

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

代码:

代码语言:javascript
复制
#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
****************************************************************/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 输入:
  • 输出:
  • 样例输入:
  • 样例输出:
  • 解题思路:
  • 代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档