#include<iostream>
using namespace std;
int a[25];//记录序列
int ans=0;//记录种类
int b[25]={0};//辅助数组
int l=0;//记录第几个数
int check (int m)
{
if(l<2)
{
return 1;
}
if(a[l]>a[l-1]&&m<a[l-1])
{
return 1;
}
if(a[l]<a[l-1]&&m>a[l-1])
{
return 1;
}
return 0;
}
int get (int k)
{
if(l==k)
{
return 0;
}
int j;
for(j=1;j<=k;j++)
{
if(b[j]==0&&check(j))//剪枝操作
{
l++;
a[l]=j;
b[j]=1;
if(l>=2)
{
ans++;
}
get(k);//记录下一个数
a[l]=0;//回溯
l--;
b[j]=0;
}
}
}
int main ()
{
int n;
cin>>n;
get(n);
cout<<ans;
}
算法训练 摆动序列(回溯算法篇)
最新推荐文章于 2025-08-18 19:26:01 发布
本文介绍了一个使用递归算法解决特定组合问题的实例。通过定义辅助数组进行剪枝操作以提高效率,并采用递归方式生成所有可能的组合序列,最终统计满足条件的序列种类。
1601

被折叠的 条评论
为什么被折叠?



