具体问题:
【问题描述】
小明想知道,满足以下条件的正整数序列的数量:
1. 第一项为 n;
2. 第二项不超过 n;
3. 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。
代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
* @author 作者:ILove996
* @version 创建时间:2020年3月25日 下午2:03:16 类说明
*/
public class Main {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> resList = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> tempList = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> acceptList = new ArrayList<ArrayList<Integer>>();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.close();
for (int i = 1; i <= n; i++) {
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(n);
res.add(i);
resList.add(res);
}
tempList.addAll(resList);
while (tempList != null && tempList.size() > 0) {
for (ArrayList<Integer> tl : tempList) {
ArrayList<ArrayList<Integer>> nextItem = nextItem(tl);
if (nextItem != null) {
acceptList.addAll(nextItem);
}
}
tempList.clear();
if (acceptList != null && acceptList.size() > 0) {
resList.addAll(acceptList);
tempList.addAll(acceptList);
acceptList.clear();
}
}
ArrayList<String> strList = new ArrayList<String>();
for (ArrayList<Integer> res : resList) {
strList.add(toGoalString(res));
}
Collections.sort(strList);
for (String string : strList) {
System.out.println(string);
}
}
private static ArrayList<ArrayList<Integer>> nextItem(ArrayList<Integer> res) {
ArrayList<ArrayList<Integer>> resList = new ArrayList<ArrayList<Integer>>();
int size = res.size();
int abs = Math.abs(res.get(size - 1) - res.get(size - 2));
if (abs <= 1) {
return null;
}
for (int i = 1; i < abs; i++) {
ArrayList<Integer> newRes = new ArrayList<Integer>();
newRes.addAll(res);
newRes.add(i);
resList.add(newRes);
}
return resList;
}
private static String toGoalString(ArrayList<Integer> res) {
StringBuffer sb = new StringBuffer();
int size = res.size();
for (int i = 0; i < size; i++) {
sb.append(res.get(i));
if (i < size - 1) {
sb.append(" ");
}
}
return sb.toString();
}
}
运行结果:


本文探讨了一种特殊的正整数序列,其中序列的第一项为给定的n,第二项不超过n,从第三项开始,每一项都小于前两项之差的绝对值。文章提供了一个算法解决方案,用于计算满足这些条件的序列数量,并通过Java代码实现了这一算法。
376

被折叠的 条评论
为什么被折叠?



