试题 算法训练 摆动序列
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
如果一个序列满足下面的性质,我们就将它称为摆动序列:
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
//解题思路:先给排列指定长度得出多少排序方法,然后在通过循环增加长度计算出总排序方法
package Main;
import java.util.Scanner;
public class Main {
//count 用于接收返回的不同个数
static int count=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int[] as=new int[m];
//循环改变i来改变每次排序为i的长度;
for (int i = 2; i <=m; i++) {
//m为输入的数(最大长度和排序数据范围为0~m),i为判断排序数字长度为i个,
//as传入一个方法用于获取和判断排序中每个位置的数,0 为获取排序长度的第(0+1)个数
Nums(m, i, as, 0);
}
System.out.print(count);
sc.close();
}
public static void Nums(int m,int le,int[] aa,int cc) {
//当排序达到指定长度时进行总数加1
if(cc==le) {
count++;
return;
}
int[] ss=aa;
for (int j = 1; j <=m; j++) {
//判断排序中数字j在前面中是否出现或满足题中大小排列不(aa中存放前cc个数字)
if(Boolshu(cc,j,aa)) {
ss[cc]=j;
int cou=cc+1;
Nums(m, le, ss,cou );
}
}
}
public static Boolean Boolshu(int co,int num,int[] aa) {
//判断co前的数是否和num有一样的,
//如果一样则num不满足题中要求的不重复性;
for (int i = 0; i <co ; i++) {
if(aa[i]==num) {
return false;
}
}
//判断num是否满足题中要求的大小排序;当co数小于2是,
//则不需要判断(因为前二个数是可以随便排列,不需要区分大小写)
if(co>=2) {
if(aa[co-2]>aa[co-1]) {
if(num>aa[co-2]) {
return true;
}
else {
return false;
}
}else {
if(num<aa[co-2]) {
return true;
}
else {
return false;
}
}
}
return true;
}
}