蓝桥杯:
问题描述
小明想知道,满足以下条件的正整数序列的数量:
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。
解题思路:画画树就会很明了
注意递归的终止条件:当前节点为0 或 当前加点与父节点差值为0 或 当前节点与父节点差值为1
//Java实现
package test;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int tmp = 0;
public static void dfs(int differ, int node) { //node为当前节点 differ为node节点与父节点的差值
if(node==0 || differ==0 || differ==1) {
tmp++;
return ;
}
for(int i=0; i<differ; i++) {
dfs(Math.abs(node-i), i);
}
}
public static void main(String[] args) {
//输入
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=1; i<=n; i++) {
dfs(n-i, i);
}
System.out.println(tmp%10000);
}
}
#Python实现
tmp = 0
def dfs(differ, node):
global tmp
if node==0 or differ==0 or differ==1 :
tmp = tmp+1
return
for j in range(0, differ):
dfs(abs(node-j), j)
def main():
n = eval(input())
for i in range(1, n+1):
dfs(n-i, i)
print(tmp%10000)
main()