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