SDUT 3460 Fighting_小银考呀考不过四级 (递推) -- 解题报告
2016-09-21 14:10
232 查看
题面
Fighting_小银考呀考不过四级Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
四级考试已经过去好几个星期了,但是小银还是对自己的英语水平担心不已。
小银打算好好学习英语,争取下次四级考试和小学弟小学妹一起拿下它!
四级考试的时候,监考老师会按考号分配固定的座位,但唯一不变的是每两个人之间肯定至少会留下两个空座位,原因相信大家都懂得。
那么问题来了,我们现在只关注教室里的一排座位,假设每排有n个座位,小银想知道这一排至少坐一个人的前提下,一共有多少种坐法。
Input
多组输入。
第一行输入整数n,代表教室里这一排的座位数目。(1 <= n <= 45)
Output
输出种类数目。输入输出各占一行,保证数据合法。
Example Input
1
3
5
Example Output
1
3
8
Hint
Author
Casithy
所需基础
递推解题思路
我们用 f表示有n个座位,且至少坐一个人的坐法种类数。
则 f
与两种情况有关:
第 n 个座位不坐人,此时的坐法与只有 n-1 个座位是等价的,即 f[n-1];
第 n 个座位坐人,此时第 n-1 和第 n-2 个座位都无法再坐人,所以此时与只有 n-3 个座位的情况是等价的,即 f[n-3]。另外,由于第 n 个座位已经坐了人,所以前面 n-3 个座位中是可以不坐人的,而 f[n-3] 仅能表示有 n-3 个座位且至少坐一人的情况,所以我们还需要把前面都不坐人的这种情况补上,即 f[n-3]+1。
综上,我们可以得到递推式:f
= f[n-1] + f[n-3] + 1。
参考代码
#include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int n, f[46] = {0, 1, 2, 3,}; for(int i=4; i<=45; ++i) { f[i] = f[i-1] + f[i-3] + 1; } while(~ scanf("%d", &n)) { printf("%d\n", f ); } return 0; }
相关文章推荐
- 递归递推之Fighting_小银考呀考不过四级
- 递推递归--G Fighting_小银考呀考不过四级
- 递推递归练习--G(Fighting_小银考呀考不过四级)
- 递推递归练习G - Fighting_小银考呀考不过四级
- 递归递推练习 G - Fighting_小银考呀考不过四级 *
- 递推递归练习 G - Fighting_小银考呀考不过四级
- ACM-递归递推练习G-Fighting_小银考呀考不过四级
- Fighting_小银考呀考不过四级
- 递推递归-G-小银呀考不过四级
- Fighting_小银考呀考不过四级
- G - Fighting_小银考呀考不过四级
- Fighting_小银考呀考不过四级
- Fighting_小银考呀考不过四级
- 递归递推练习G小银呀考不过四级
- Fighting_小银考呀考不过四级
- Fighting_小银考呀考不过四级 (sdut oj)
- G - Fighting_小银考呀考不过四级
- 递推递归练习 G 小银考呀考不过四级
- Fighting_小银考呀考不过四级
- fighting小银考呀考不过四级