Problem Description
ZJiaQ want to become a strong man, so he decided to play the mook jong。ZJiaQ want to put some mook jongs in his backyard. His backyard consist of n bricks that is 1*1,so it is 1*n。ZJiaQ want to put a mook jong in a brick. because of the hands of the mook jong, the distance of two mook jongs should be equal or more than 2 bricks. Now ZJiaQ want to know how many ways can ZJiaQ put mook jongs legally(at least one mook jong).
Input
There ar multiply cases. For each case, there is a single integer n( 1 < = n < = 60)
Output
Print the ways in a single line for each case.
Sample Input
1
2
3
4
5
6
Sample Output
1
2
3
5
8
12
Source
BestCoder Round #50 (div.2)
——————————并不华丽的分界线—————————————–
题目大意:ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。
假设用f[n]表示有n个地板时所有的可能情况,那么可以分为两种情况。
一种是如果在第n个地板上不放置木桩的情况,一种是如果在第n个地板上放置木桩的情况。
对于第一种情况,可能的方案就为f[n-1],因为不在这个地板上放置木桩,所以等同于有n-1个地板可以放置的方案数。
而对于第二种情况,我们知道,如果在第n个木板上放置木桩,那么上一个放置木桩的地方最近可以为n-3的地方,也就是说等同于在n-3个木板上放置木桩的最大方案数,但是因为在n-3个地板上放置的方案数不包括一个木桩都不放的情况,而如果仅在第n个木桩放置木桩,那么则需要加一。
由此可以得到递推关系:f[n] = f[n-1] + f[n-3] + 1;
那么这道题就非常容易了。
代码如下
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL n;
LL f[61];
f[1] = 1;
f[2] = 2;
f[3] = 3;
for(int i = 4; i <= 60; i++){
f[i] = f[i-1] + f[i-3] + 1;
}
while(~scanf("%lld",&n)){
printf("%lld
",f[n]);
}
return 0;
}
如有哪里疏漏,请各位大牛指正。