摆动序列
Time Limit: 1 Memory Limit: 128 MB Submit 0 Solved 0
Description
如果一个序列满足下面的性质,我们就将它称为摆动序列:
1. 序列中的所有数都是不大于k的正整数;
2. 序列中至少有两个数。
3. 序列中的数两两不相等;
4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。
比如,当k = 3时,有下面几个这样的序列:
1 2
1 3
2 1
2 1 3
2 3
2 3 1
3 1
3 2
一共有8种,给定k,请求出满足上面要求的序列的个数。
Input
输入包含了一个整数k。(k<=20)
Output
输出一个整数,表示满足要求的序列个数。
Sample Input
3
Sample Output
8
思路:看注释把,就是改一下全排列的搜索代码,但是有几个点要注意
代码:
#include
#include
#include
#define in(x) scanf("%d",&x)
#define out(x) printf("%lld",x)
using namespace std;
int n,vis[25],k[25];
long long int sum=0;
bool judge(int num,int i)
{
if(i==2||i==1) return true;
if(k[i-1]>k[i-2]&&numk[i-2]) return true;
else return false;//第二个if每次放入都判断,这样没有后效性
}
void dfs(int index)
{
if(index>n) return;
for(int i=1;i<=n;i++){
if(!vis[i]&&judge(i,index)){//之前写的是先搜索再判断结果超时很严重
vis[i]=1,k[index]=i; //后来参考别人的先判断再搜索(神剪枝)
if(index>=2){
sum++;
}
dfs(index+1);
vis[i]=0;
}
}
}
int main()
{
sum=0;
in(n);
dfs(1);
out(sum);
}