HDU-5366-The mook jong

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;
}

如有哪里疏漏,请各位大牛指正。

原文地址:https://www.cnblogs.com/wiklvrain/p/8179490.html