小明想知道,知足如下条件的正整数序列的数量:java
1. 第一项为 n;数组
2. 第二项不超过 n;测试
3. 从第三项开始,每一项小于前两项的差的绝对值。spa
请计算,对于给定的 n,有多少种知足条件的序列。code
输入一行包含一个整数 n。对象
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。blog
4递归
7class
如下是知足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4import
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于全部评测用例,1 <= n <= 1000。
① 研究对象始终都是只有三项,因此用大小为3的数组用来存放研究的三个对象。——序列长度未知,因此考虑递归的思想。
② 第一项、第二项的肯定规则和第三项和后面的肯定规则不一样,观察得出,长度只有2的序列只有n(输入的第一项n)个。
因为不知道具体测试用例数据,因此本人也没法肯定答案是否彻底正确。本身手动算出1——5的数据输入,测试出答案正确。
可是根据题目给出的评测用例规模和约定。
当输入数据较大时,本答案会超时。
若是有大神作出完美答案,拜托评论留下。
1 import java.util.Scanner; 2 3 public class Main{ 4 static int n,out; 5 public static void main(String[] args) { 6 Scanner scan = new Scanner(System.in); 7 n = scan.nextInt(); 8 out = 0; 9 int[] arr = new int[3]; //arr用于存放一直变化的长度为3的序列研究对象 10 arr[0] = n; 11 for(int i = 1; i <= n; i++) { 12 arr[1] = i; 13 f(arr[0], arr[1]); 14 } 15 System.out.println((out+n)%10000); //加上的n是,序列长度为2的全部序列数量。 16 scan.close(); 17 } 18 private static void f(int arr0, int arr1) { 19 // TODO Auto-generated method stub 20 for(int i = 1; i <= n; i++) { 21 if(i < cha(arr0,arr1)) { 22 int arr2= i; 23 f(arr1,arr2); 24 out++; 25 } 26 } 27 } 28 private static int cha(int i, int j) { //返回绝对值 29 // TODO Auto-generated method stub 30 if(i>j) return i-j; 31 else return j-i; 32 } 33 }
_____________________
输入:3 输出:4
知足条件的序列:
3 1
3 1 1
3 2
3 3
———————————
输入:5 输出:14
知足条件的序列:
5 1
5 1 1
5 1 5
5 1 3
5 1 3 1
5 1 3 1 1
5 2
5 2 1
5 2 2
5 3
5 3 1
5 3 1 1
5 4
5 5
———————————