您的位置:首页 > 其它

2020年蓝桥杯第十一届校内赛真题解析--算法设计--正整数序列

2020-04-02 07:24 435 查看

2020年蓝桥杯第十一届校内赛真题解析--算法设计--正整数序列

比赛记录

本人于2020年3月14日14:00~18:00,参加了本校组织的校内模拟赛 。
本次校内模拟赛的感受较好,我觉得这次的难度适中,大家应该都可以取得自己理想的成绩。

问题描述

小明想知道,满足以下条件的正整数序列的数量:
  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.Scanner;
public class Main {
static int[][] flag = new int[1001][1001];  //做标记值,表示当前n m 下能能有多少个符合要求的序列,后面再查到相同的n m的时候直接使用
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n =scanner.nextInt();
int count = 0;
for (int i = 1; i <=n; i++) {
//递归
count=count+f(n,i)%10000;
}
System.out.println(count%10000);
}
public static int f(int n,int m){
int count = 0;
if(Math.abs(n-m)<=1){
return 1;
}
if(flag[n][m]!=0){
//当flag存在值时,意味着已经计算过,可以不用再做下面的遍历
return flag[n][m];
}
for (int i = 0; i < Math.abs(n-m); i++) {
if(i==0){  //当i==0得时候,也就是意味着当前已结束  举例 4 1 0 等同于4 1 ''  ,那么0后面的也就不需要再做递归了,所以continue
count++;
continue;
}
count=count + f(m,i);
}
flag[n][m]=count;  //计算完当前数据后存入flag,用做标记
return count%10000;
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
星宇_大佬养成时 发布了10 篇原创文章 · 获赞 0 · 访问量 87 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐