擅长排列的小明 II
-
描述
-
小明十分聪明,而且十分擅长排列计算。
有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列:
1、第一个数必须是1
2、相邻两个数之差不大于2
你的任务是给出排列的种数。
-
输入
- 多组数据。每组数据中输入一个正整数n(n<=55). 输出
- 输出种数。 样例输入
-
4
样例输出
-
4
-
-
规律题
-
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<iomanip>
#include<numeric>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <sstream> //基于字符串的流
#include <utility> //STL 通用模板类
#include <complex.h> //复数处理
#include <fenv.h> //浮点环境
#include <inttypes.h> //整数格式转换
#include <stdbool.h> //布尔环境
#include <stdint.h> //整型环境
#include <tgmath.h> //通用类型数学宏
#define L(a,b,c) for(int a = b;a >= c;a --)
#define M(a,b,c) for(int a = b;a < c;a ++)
#define N(a,b) memset(a,b,sizeof(a));
const int MAX=100000000;
const int MIN=-MAX;
typedef int T;
typedef double D;
typedef char C;
using namespace std;
int main()
{
int n,a[100]={0,1,1,2,4};
M(i,5,60)
a[i]=a[i-1]+a[i-3]+1;
while(~scanf("%d",&n))
printf("%d\n",a[n]);
return 0;
}
-
-
深搜的话就会超时了
-
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<iomanip>
#include<numeric>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <sstream> //基于字符串的流
#include <utility> //STL 通用模板类
#include <complex.h> //复数处理
#include <fenv.h> //浮点环境
#include <inttypes.h> //整数格式转换
#include <stdbool.h> //布尔环境
#include <stdint.h> //整型环境
#include <tgmath.h> //通用类型数学宏
#define L(a,b,c) for(int a = b;a >= c;a --)
#define M(a,b,c) for(int a = b;a < c;a ++)
#define N(a,b) memset(a,b,sizeof(a));
const int MAX=100000000;
const int MIN=-MAX;
typedef int T;
typedef double D;
typedef char C;
using namespace std;
int a[60],b[100],n,sum;
void dfs(int num)
{
if(num==n)
{
sum++;
return ;
}
else
{
for(int i=2; i<=n; i++)
if(!b[i]&&abs(i-a[num-1])<=2)
{
b[i]=1;
a[num]=i;
dfs(num+1);
b[i]=0;
}
}
}
int main()
{
while(cin>>n)
{
N(a,0)
N(b,0)
a[0]=1;
sum=0;
dfs(1);
cout<<sum<<endl;
}
return 0;
}