• 摆动序列


    蓝桥杯 摆动序列
    问题描述
      如果一个序列满足下面的性质,我们就将它称为摆动序列:
      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;
    				}
    			}
    		}
    	}
    
    }
  • 相关阅读:
    ACM进阶
    hdu 2018 母牛的故事
    hdu 2084 数塔
    动态规划算法
    hdu 1003 Max sum
    hihocoder 1037 数字三角形
    UDP和TCP的区别(转)
    JS简单的图片左右滚动
    C# MD5加密的方法+一般处理程序使用Session+后台Json序列化
    CSS DIV 独占一行,清除左右两边的浮动
  • 原文地址:https://www.cnblogs.com/AIchangetheworld/p/12771760.html
Copyright © 2020-2023  润新知