The mook jong
问题描述
ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。
输入描述
输入有多组数据,每组数据第一行为一个整数n(1 < = n < = 60)
输出描述
对于每组数据输出一行表示摆放方案数
输入样例
1 2 3 4 5 6
输出样例
1 2 3 5 8 12
dp的题做的很少,看到题基本都没思路,大概多做些能好?
代码:
/************************************************
Problem : 5366 ( The mook jong ) Judge Status : Accepted
RunId : 14463983 Language : G++ Author : G_lory
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
************************************************/
#include <iostream>
#include <cstdio>
using namespace std;
//令f[i]为最后一个木人桩摆放在i位置的方案,令s[i]为f[i]的前缀和
const int N = 65;
long long f[N];
long long s[N];
int main()
{
f[1] = 1; f[2] = 1; f[3] = 1;
s[1] = 1; s[2] = 2; s[3] = 3;
for (int i = 4; i <= 60; ++i) {
f[i] = s[i - 3] + 1;
s[i] = s[i - 1] + f[i];
}
int n;
while (scanf("%d", &n) == 1)
printf("%lld
", s[n]);
return 0;
}