dfs的尴尬
作者:互联网
@dfs的尴尬
题目:
————————————————————————
一个长度为N的排列,由数字1~N组成,它满足两个条件。
1、数字1永远在第一位。
2、任意两个相邻数字之差小于等于2。
现在给出一个N,
你能知道能组成多少个符合条件的排列吗?。
例如:
N=4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
所以答案为4
————————————————————————
WaWa听后也是一脸懵逼。
现在WaWa想求助于你们,WaWa给出一个正整数N,问你用1~N能组成多少个符合题意的排列。
格式
输入格式
多组数据。
每组数据输入一个正整数N(1<=N<=100)。
输出格式
输出符合题意的排列个数
解法1
#include<stdio.h>
int f_step;
int arr[101];
int sum;
int a[1111];
void dfs(int steps,int num)
{
if(steps==f_step)
{
// for(int b=1;b<f_step;b++)
// printf("%d “,a[b]);
// printf(”\n");
sum++;
return;
}
if(arr[num+1]==0&&(num+1<=f_step))
{
// printf(“NNUUMM %d\n”,num+1);
arr[num+1]=1;
a[steps]=num+1;
dfs(steps+1,num+1);
arr[num+1]=0;
}
if(arr[num+2]==0&&(num+2<=f_step))
{
// printf(“NNUUMM %d\n”,num+2);
arr[num+2]=1;
a[steps]=num+2;
dfs(steps+1,num+2);
arr[num+2]=0;
}
if(arr[num-1]==0&&num>1)
{
arr[num-1]=1;
a[steps]=num-1;
dfs(steps+1,num-1);
arr[num-1]=0;
}
if(arr[num-2]==0&&num>2)
{
arr[num-2]=1;
a[steps]=num-2;
dfs(steps+1,num-2);
arr[num-2]=0;
}
}
int main()
{
a[1]=1;
while(scanf("%d",&f_step)!=EOF)
{
a[1]=1;
arr[1]=1;
dfs(1,1);
printf("%d\n",sum);
sum=0;
for(int c=0;c<=f_step;c++)
arr[c]=0;
}
}
//显然dfs对100的大小无能为力
只有1s时间故超时了
(1min好像也没用)
解法2
#include<stdio.h>
int main()
{
int num;
long long a[1000];
a[1]=1;
a[2]=1;
a[3]=2;
a[4]=4;
for(int i=5;i<=100;i++)
a[i]=a[i-1]+a[i-3]+1;
while(scanf("%d",&num)!=EOF)
{
printf("%lld\n",a[num]);
}
}
!!显然他是一个递推题先举出前10项
再的出公式
??我怎么知道我是对的呢
所以有时候要相信自己
总结
提示:这里对文章进行总结:
对于显然算法复杂
又难以优化
就要想到这种方法啦
不然100的数据估计都到下世纪了
标签:arr,int,dfs,尴尬,num,steps,printf 来源: https://blog.csdn.net/liuxinyubest/article/details/111709423