最常遞增子序列

最常遞增子序列(Most Frequent Increasing Subsequence,簡稱MFIS)是一個在序列中尋找出現次數最多的遞增子序列的問題。這裡的「遞增子序列」指的是一個序列的子集合,其中每個元素都大於或等於前一個元素。

例如,給定序列 [1, 2, 3, 4, 4, 3, 2, 1],其中一個最常遞增子序列是 [1, 2, 3, 4],因為它們是連續的且次數為2。另一個最常遞增子序列是 [1, 1][2, 2][3, 3][4, 4],因為它們各自出現了一次。

為了找到最常遞增子序列,可以採用動態規劃的方法。我們可以定義一個狀態 f[i][j] 表示前 i 個元素中,第 i 個元素為 j 時的最常遞增子序列的次數。這樣,我們可以通過以下規則來計算狀態:

  1. 如果 a[i] > a[i-1],則 f[i][j] = f[i-1][j-1] + 1,表示在原序列中增加一個元素 a[i]
  2. 如果 a[i] <= a[i-1],則 f[i][j] = max(f[i-1][k] for k in range(1, j)),表示在原序列中不增加 a[i],而是尋找次數最多的遞增子序列。

最後,我們可以通過累加 f[n][1]f[n][max_value] 來找到最常遞增子序列的次數。

以下是一個簡單的Python實現:

def find_mfis(arr):
    n = len(arr)
    max_value = max(arr)
    f = [[0 for _ in range(max_value + 1)] for _ in range(n)]

    for i in range(n):
        for j in range(1, max_value + 1):
            if arr[i] <= j:
                f[i][j] = max(f[i-1][k] for k in range(1, j))
            else:
                f[i][j] = f[i-1][j-1] + 1

    max_count = 0
    for j in range(1, max_value + 1):
        if f[n-1][j] > max_count:
            max_count = f[n-1][j]
            mfis = j

    return mfis

arr = [1, 2, 3, 4, 4, 3, 2, 1]
print(find_mfis(arr))

這個算法的時間複雜度為 O(n * max_value),空間複雜度為 O(n * max_value)。如果序列中的元素數量很大,可以使用二維數組來存儲狀態,這樣可以減少空間複雜度。