📌  相关文章
📜  词典上最大的N长度Bitonic序列,由给定范围内的元素组成(1)

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

最大N长度Bitonic序列

本篇介绍的算法能够在给定范围内找到最大N长度的Bitonic序列,其中一个Bitonic序列是先单增后单减的序列。在本算法中,我们使用了动态规划的思想。

算法

我们定义一个二维数组dp[i][j]表示以第i个元素结尾、长度为j的单增序列的最大值,另外,我们还定义一个数组rp[i]表示以第i个元素开头的逆序列的最大值。那么,我们就可以描述出状态转移方程式:

  • dp[i][j] = max(dp[k][j-1]) + a[i], 其中k<i且a[k]<a[i]。
  • rp[i] = max(dp[k][j-1]) + a[i], 其中k>i且a[k]<a[i]。

至于如何求解最终的结果,我们只需要枚举每一个元素i作为单增序列的最后一个元素和逆序列的第一个元素,求出答案的最大值即可。

代码实现

下面是本算法的Python实现代码:

def bitonic_sequence(a, n):
    dp = [[0 for j in range(n)] for i in range(n)]
    rp = [0 for i in range(n)]
    for i in range(n):
        dp[i][0] = a[i]
        rp[i] = a[i]
    for j in range(1, n):
        for i in range(j, n):
            dp[i][j] = max([dp[k][j-1] for k in range(i) if a[k] < a[i]]) + a[i]
    for j in range(1, n):
        for i in range(n-1, j-1, -1):
            rp[i] = max([dp[k][j-1] for k in range(i+1,n) if a[k] < a[i]]) + a[i]
    return max([dp[i][j]+rp[i] for i in range(n) for j in range(n)])

Markdown中代码片段如下:

```python
def bitonic_sequence(a, n):
    dp = [[0 for j in range(n)] for i in range(n)]
    rp = [0 for i in range(n)]
    for i in range(n):
        dp[i][0] = a[i]
        rp[i] = a[i]
    for j in range(1, n):
        for i in range(j, n):
            dp[i][j] = max([dp[k][j-1] for k in range(i) if a[k] < a[i]]) + a[i]
    for j in range(1, n):
        for i in range(n-1, j-1, -1):
            rp[i] = max([dp[k][j-1] for k in range(i+1,n) if a[k] < a[i]]) + a[i]
    return max([dp[i][j]+rp[i] for i in range(n) for j in range(n)])