nyoj 469 擅长排列的小明 II

来源:互联网 发布:php mktime 编辑:程序博客网 时间:2024/06/02 07:30

擅长排列的小明 II

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

小明十分聪明,而且十分擅长排列计算。

有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列:

1、第一个数必须是1

2、相邻两个数之差不大于2

你的任务是给出排列的种数。

输入
多组数据。每组数据中输入一个正整数n(n<=55).
输出
输出种数。
样例输入
4
样例输出
4
思路:
当第二个是2的时候,第2个到第n的列相当于第1到第n的排列(f(n-1),第二个为3的时候,后面可以填2和4,5,填4的话这一条就断了(不然2就不能填了),填3的话,第3个到第n个相当于第1个到-3个(f(n-3)),填5是种特殊情况,先单调递增到最大(等差数列),再递减到2(也是等差数列),所以加1.
#include<cstdio>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int main(){    int a[58],N;    a[1]=1;a[2]=1;a[3]=2;    for(int i=4;i<=56;i++)       a[i]=a[i-1]+a[i-3]+1;    while(cin>>N)    cout<<a[N]<<endl;    return 0;}