最初的想法是深搜,超时
#include<stdio.h>
int n;
int count;
bool vis[56];
int num[56];
void dfs(int i,int m){
num[i]=m;
if(m-num[i-1]>2||num[i-1]-m>2) return ;
if(i==n){
count++;return ;
}
for(int k=2;k<=n;k++){
if(!vis[k]){
vis[k]=1;
dfs(i+1,k);
vis[k]=0;
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
count=0;
num[0]=0;
dfs(1,1);
printf("%d\n",count);
}
return 1;
}
然后开始找规律啊找规律:
1 1 2 4 6 9 14 21 31 46。。。(这些值由深搜来)
然后发现相邻值得差是这样的:0 1 2 2 3 5 7 10 15
规律就出来了:
2=0+2
3=1+2
5=3+2
7=5+2
10=7+3
15=10+5
代码如下:
#include<stdio.h>
int cha[56],num[56];
int main(){
int n;
cha[0]=0;cha[1]=1;cha[2]=2;num[0]=1;
while(scanf("%d",&n)!=EOF){
for(int i=3;i<n;i++)
cha[i]=cha[i-1]+cha[i-3];
for(int i=1;i<n;i++)
num[i]=num[i-1]+cha[i-1];
printf("%d\n",num[n-1]);
}
return 1;
}