2865. 美丽塔 I
最后更新于
这有帮助吗?
这有帮助吗?
输入:maxHeights = [6,5,3,9,2,7]
输出:22
解释: 和最大的美丽塔方案为 heights = [3,3,3,9,2,2] ,这是一个美丽塔方案,因为:
- 1 <= heights[i] <= maxHeights[i]
- heights 是个山脉数组,峰值在 i = 3 处。
22 是所有美丽塔方案中的最大高度和。输入:maxHeights = [3,2,5,5,2,3]
输出:18
解释:和最大的美丽塔方案为 heights = [2,2,5,5,2,2] ,这是一个美丽塔方案,因为:
- 1 <= heights[i] <= maxHeights[i]
- heights 是个山脉数组,最大值在 i = 2 处。
注意,在这个方案中,i = 3 也是一个峰值。
18 是所有美丽塔方案中的最大高度和。ans, n = 0, len(maxHeight)
for i, x in enumerate(maxHeight):
y = t = x
# t 是高度和,y 是 min_v
for j in range(i - 1, -1, -1):
y = min(y, maxHeight[j])
t += y
y = x
for j in range(i + 1, n):
y = min(y, maxHeight[j])
t += y
ans = max(ans, t)
return ans
class Solution:
def maximumSumOfHeights(self, maxHeight: List[int]) -> int:
n = len(maxHeight)
f = [-1] * n # f[i] 表示 i 作为峰顶左侧的高度和
g = [-1] * n # g[i] 表示 -i-1 作为峰顶右侧的高度和
def gao(f):
st = []
for i in range(len(maxHeight)):
while st and maxHeight[i] <= maxHeight[st[-1]]:
st.pop()
if st:
f[i] = (i - st[-1]) * maxHeight[i] + f[st[-1]]
else:
f[i] = maxHeight[i] * (i + 1)
st.append(i)
gao(f)
maxHeight = maxHeight[::-1]
gao(g)
maxHeight = maxHeight[::-1]
ans = 0
for i in range(len(maxHeight)):
ans = max(ans, f[i] + g[-i-1] - maxHeight[i])
return ans