📌  相关文章
📜  最长子序列,使得子序列中的每个元素都是通过将前一个元素与素数相乘而形成的(1)

📅  最后修改于: 2023-12-03 15:40:17.163000             🧑  作者: Mango

最长素数子序列

本文介绍了一种算法,用于找到给定序列中最长的,由相邻元素相乘得到的素数序列。

算法描述
  1. 定义一个动态规划数组 dp,dp[i] 表示以第 i 个元素结尾的最长素数子序列的长度。
  2. 初始化 dp 数组为 1,即每个元素本身都是一个长度为 1 的素数子序列。
  3. 对于每个元素 i,枚举前面的元素 j,如果 j 是素数,并且 i 是 j 的倍数,说明 i 可以加入以 j 结尾的素数子序列中,更新 dp[i] 为 dp[j]+1。
  4. 最终 dp 数组中的最大值即为所求结果。
代码实现
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def longest_primes_subsequence(nums):
    dp = [1] * len(nums)
    for i in range(1, len(nums)):
        for j in range(i):
            if is_prime(nums[j]) and nums[i] % nums[j] == 0:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

# example
nums = [2, 3, 6, 7, 8, 21, 23]
longest_primes_subsequence(nums) # 3
性能分析
  • 时间复杂度:$O(n^2\sqrt{n})$,其中 n 是序列长度。
  • 空间复杂度:$O(n)$。
  • 所需素数判定次数与序列中素数个数有关,不会超过序列长度。