Java实现 蓝桥杯VIP 算法训练 摆动序列

问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:
  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,请求出满足上面要求的序列的个数。
输入格式
  输入包含了一个整数k。(k<=20)
输出格式
  输出一个整数,表示满足要求的序列个数。
样例输入
3
样例输出
8

import java.util.Scanner;


public class 摆动序列 {
	public static int [] v = new int [30];
	public static int [] value = new int [30];
	public static int n,ans=0;
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		n=sc.nextInt();
		dfs(1);
		System.out.println(ans-n);
	}
	public static void dfs(int x){
	    if(x>n) return ;
	    if(x==1||x==2){             //初始长度为1或者2时比较特殊 
	        for(int i=1;i<=n;i++){
	            if(v[i]==0){
	                value[x]=i;
	                v[i]=1;
	                ans++;
	                dfs(x+1);
	                value[x]=0;     //每次记得还原回来就行了 
	                v[i]=0;
	            }
	        }
	    }
	    else {
	        if(value[x-1]>value[x-2]){  //下面分别是两种情况 
	            for(int i=1;i<value[x-2];i++){
	                if(v[i]==0){
	                    ans++;
	                    value[x]=i;
	                    v[i]=1;
	                    dfs(x+1);
	                    value[x]=0;
	                    v[i]=0;
	                }
	            }
	        }
	        else if(value[x-1]<value[x-2]){
	            for(int i=value[x-2];i<=n;i++){
	                if(v[i]==0){
	                    ans++;
	                    value[x]=i;
	                    v[i]=1;
	                    dfs(x+1);
	                    value[x]=0;
	                    v[i]=0;
	                }
	            }
	        }
	    }
	}

	

}

posted @ 2019-06-19 13:27  南墙1  阅读(19)  评论(0编辑  收藏  举报