• 摆动序列


    蓝桥杯 摆动序列
    问题描述
      如果一个序列满足下面的性质,我们就将它称为摆动序列:
      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 Main {
    	static int[] value = new int[22];
    	static int[] vis = new int[22];
    	static int k = 0;
    	static int ans = 0;//统计结果
    	public static void main(String args[]){
    		Scanner sc = new Scanner(System.in);
    		k = sc.nextInt();
    		sc.close();
    		dfs(1);
    		System.out.println(ans - k);
    	}
    	
    	private static void dfs(int step){
    		if(step > k)
    			return;
    		if(step==1 || step==2){		//初始化得把1考虑进去,输出结果的时候减掉n就行
    			for(int i=1;i<=k;i++){
    				if(vis[i] == 0){
    					value[step] = i;
    					vis[i] = 1;
    					ans++;
    					dfs(step+1);
    					value[step] = 0;	//这个下次还得用,需要还原最初的情况
    					vis[i] = 0;
    				}
    			}
    		}else{
    			if(value[step-1] > value[step-2]){
    				for(int i=1;i<value[step-2];i++){
    					ans++;
    					value[step] = i;
    					vis[i] = 1;
    					dfs(step+1);
    					value[step] = 0;
    					vis[i] = 0;
    				}
    			}else if(value[step-1] < value[step-2]){
    				for(int i=value[step-2]+1;i<=k;i++){
    					ans++;
    					value[step] = i;
    					vis[i] = 1;
    					dfs(step+1);
    					value[step] = 0;
    					vis[i] = 0;
    				}
    			}
    		}
    	}
    
    }
  • 相关阅读:
    D365FO Debug找不到w3cp进程
    D365FO 10.0PU32 开发环境 Data Management导出失败
    一张图看懂项目管理
    用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
    敏捷考证?你应该知道的敏捷体系认证(最全名单)
    漫画:禅道程序员的一天
    敏捷开发管理--任务分解经验之谈
    漫画:优秀程序员的必备特质有哪些?
    漫画:女生/男生告白攻略
    漫画:程序员脱单秘籍
  • 原文地址:https://www.cnblogs.com/techgy/p/12771760.html
Copyright © 2020-2023  润新知