华为OD机考双机位A卷 - 构造数列 (Java & Python& JS & C/C++ & GO )

华为OD构造数列问题解析

最新华为上机考试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
2025华为od机试双机位A卷 -华为OD上机考试双机位A卷

题目描述

小明在做构造数列的题目,题目要求数列中第一个数为n,且数列后面的每一个数字都不能大于前一个数字的一半,数列的元素都是正整数,请问在给定n的情况下,最多能构造多少合法且不同的数列?

输入描述

输入一个n

备注

1 <= n< 10000

输出描述

输出可以构造的序列个数

示例1

输入

7

输出

6

说明

可以构成 [7], [7,3],[7,2],[7,1],[7,3,1],[7,2,1]

示例2

输入

5

输出

4

说明

可以构成 [5],[5,2],[5,1],[5,2,1]

解题思路

这个问题是要计算以给定数字n开头的所有可能序列数量,其中序列的每个后续数字不能大于前一个数字的一半。

核心思想

  1. 动态规划与记忆化搜索:使用自顶向下的动态规划方法,通过记忆化搜索避免重复计算相同的子问题。
  2. 状态定义countSequences(cur, memo)表示以数字cur开头的所有可能序列数量。
  3. 递推关系
    • 基本情况:每个数字至少能形成一个序列(即只包含自身)
    • 对于cur,我们尝试所有可能的下一个值i(1 ≤ i ≤ cur/2)
    • 递归计算以i开头的所有序列数量,并将这些数量累加
  4. 记忆化:使用memo数组存储已计算的结果,避免重复计算。

时间复杂度分析

  • 没有记忆化的情况下,时间复杂度会是指数级的O(2^n)
  • 使用记忆化后,每个状态只计算一次,总状态数为O(n),每个状态的计算时间为O(n),因此总时间复杂度为O(n²)

Java

import java.util
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值