AcWing 区间DP相关问题 282. 石子合并

'''
区间DP模板题
'''

N = int(input())
arr = list(map(int, input().split()))

# dp(i,j)表示从i到j的区间中的石子合并成一个石子的所有方案中最小的开销
dp = [[0] * N for _ in range(N)]

s = [val for val in arr]
for i in range(1, len(s)):
    s[i] += s[i - 1]

for i in range(N - 1, -1, -1):
    for j in range(i, N):
        if i != j:
            dp[i][j] = 0x7fffffff

            for k in range(i, j):
                sum = s[j] if i == 0 else s[j] - s[i - 1]
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum)

print(dp[0][N - 1])

猜你喜欢

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