📜  最长的子阵列形成几何级数(GP)(1)

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

求最长的子阵列形成几何级数

当我们需要求解最长的子阵列时,我们可以将其转化为寻找一个等比数列。这个等比数列的公比为 $q = \frac{\mathrm{max}}{\mathrm{min}}$,其中 $\mathrm{max}$ 和 $\mathrm{min}$ 分别为这个数列中最大值和最小值。

我们可以使用动态规划的方法来解决这个问题。设 $f_i$ 表示以 $a_i$ 结尾的最长等比数列的长度,则状态转移方程为:

$$ f_i = \begin{cases} 1 &i=1 \ 2 &i=2, \ a_2 = qa_1 \ \max_{j=1}^{i-1} {f_j+1} &\text{otherwise, 找到最长等比数列的末尾 }a_k \text{ 满足 } a_i = qa_k \end{cases} $$

时间复杂度为 $O(n^2)$。

以下是 Python 代码实现:

def geometric_progression(arr):
    n = len(arr)
    if n < 2:
        return n
    f = [2] * n  # 初始化,等比数列至少有两项
    max_len = 1  # 初始化,等比数列长度至少为1
    for i in range(2, n):
        for j in range(i):
            if arr[i] == arr[j] * (arr[i-1] / arr[j]):
                f[i] = max(f[i], f[j]+1)
        max_len = max(max_len, f[i])
    return max_len

欢迎使用,如果有任何问题或建议,请留言~