(step3.1.3)hdu 2046(骨牌铺方格)

来源:互联网 发布:知乎首页代码 编辑:程序博客网 时间:2024/05/20 04:12

题目大意: 输入长方形方格的长。输出铺满长方形方格共有多少种铺法。。。


解题思路:


1从图中也可以观察出来,第N张牌的排列可以又N-1张牌的排列再在末尾加上一张竖的牌。这样依然合法。

也可以在N-2张合法排列的牌后面加上两张横着放的牌(如果竖着放就和上面一种重复了)
所以f(n) = f(n-1) + f(n-2)
即又是一个斐波那契数列。

注意:我是打表做的,竟然要用到__int64 。没用这个AC不了。

2摆放第n块的时候,第n-1块可以不动,直接方上第n块,也可以将第n-1块横过来,这样也可以放入第n块。

递推公式为:f(n)=f(n-1)+f(n-2).

算法:N个前面有二种做法,1.前面做好了N-1个,则再加一个格子只有一种做法,(N-1)*1

2.前面N-2个已经排好,再加二个格子,只有一种做法(横排,若是竖排则与第一种做法相同),(N-1)*1

加法原理f(n)=f(n-1)+f(n-2)



代码如下:

/* * 2046_1.cpp * *  Created on: 2013年8月12日 *      Author: Administrator */   我喜欢章泽天。。。。。。#include <stdio.h>#include <string.h>int main(){__int64 fib[51];memset(fib,0,sizeof(fib));fib[1] = 1;fib[2] = 2;int i ;for( i = 3 ; i <= 50 ; ++i){fib[i] = fib[i-1] + fib[i-2];}int n;while(scanf("%d",&n)!=EOF){printf("%I64d\n",fib[n]);}}


原创粉丝点击