AcWing 区间DP相关问题 320. 能量项链

'''
区间DP问题
'''

N = int(input())

arr = list(map(int, input().split()))
# 把圈拆成链条
arr = arr * 2

from functools import lru_cache


# dp(i, j)表示区间i, j中所有计算顺序的选择中,最佳选择对应的最大收益
@lru_cache(typed=False, maxsize=128000000)
def dp(i, j):
    if j - i < 2:
        return 0

    if j - i == 2:
        return arr[i] * arr[i + 1] * arr[i + 2]

    ans = 0
    for k in range(i + 1, j):
        tmp = dp(i, k) + dp(k, j) + arr[i] * arr[k] * arr[j]
        ans = max(ans, tmp)

    return ans


ans = 0
for i in range(N):
    ans = max(ans, dp(i, i + N))
print(ans)

猜你喜欢

转载自blog.csdn.net/xiaohaowudi/article/details/107730118