"""
https://www.lanqiao.cn/problems/1233/learning/?page=1&first_category_id=1&problem_id=1233
"""
n = int(input())
a = [0] + list(map(int, input().split()))
# 前缀和
s = [0] * (n + 1)
# dp[i][j]表示将区间[i, j]的石子合并为一堆的最小花费
dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]
# 初始化前缀和和dp数组
for i in range(1, n + 1):
s[i] = s[i - 1] + a[i]
dp[i][i] = 0
# 枚举区间长度
for l in range(2, n + 1):
# 枚举左端点
for i in range(1, n + 2 - l):
j = l + i - 1 # 区间右端点
# 枚举区间间的一个点, 将区间分成两部分, [i, k]和[k + 1, j]
for k in range(i, j):
# dp[i][k]表示将区间[i, k]合并为一堆的最小花费
# dp[k + 1][j]表示将区间[k + 1, j]合并为一堆的最小花费
# s[j] - s[i - 1]表示将两堆合并后的石子合并为一堆的花费
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + s[j] - s[i - 1])
print(dp[1][n])
蓝桥杯-石子合并
最新推荐文章于 2024-04-08 00:59:00 发布