首页 > 代码库 > NYOJ 469 擅长排列的小明 II

NYOJ 469 擅长排列的小明 II

擅长排列的小明 II

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

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

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

1、第一个数必须是1

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

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

 
输入
多组数据。每组数据中输入一个正整数n(n<=55).
输出
输出种数。
样例输入
4
样例输出
4
来源
Ural
上传者
李文鑫


解题:俺找规律才找出来的,开始写了个暴力搜索,输出前10项结果
1 1
2 1
3 2
4 4
5 6
6 9
7 14
8 21
9 31
10 46
找到规律了吧。哈哈

先上超时代码:
 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long10 using namespace std;11 int d[51],n,cnt;12 bool used[51];13 void dfs(int cur,int pre){14     if(cur > n) {15         cnt++;16         return;17     }18     int x = pre-2, y = pre+2;19     for(x; x <= y && x <= n; x++){20         if(x >= 1 && !used[x]){21             used[x] = true;22             dfs(cur+1,x);23             used[x] = false;24         }25     }26 }27 int main(){28     while(~scanf("%d",&n)){29         cnt = 0;30         memset(used,false,sizeof(used));31         used[1] = true;32         for(int i = 1; i <= n; i++) d[i] = i;33         dfs(2,1);34         printf("%d\n",cnt);35     }36     return 0;37 }
View Code

 

AC代码

 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long10 using namespace std;11 int main(){12     int ans[60] = {1,1,1,2,4,6},i;13     for(i = 4; i <= 55; i++)14         ans[i] = ans[i-1]+ans[i-3]+1;15     while(~scanf("%d",&i)) printf("%d\n",ans[i]);16     return 0;17 }
View Code