题目来源:
leetcode题目,网址:2866. 美丽塔 II - 力扣(LeetCode)
解题思路:
单调栈+dp。维护两个数组 pre 和 suffix,pre[i] 表示以第 i 个为山峰时 [0,i] 的最大值,suffix[i]表示以 第 i 个为山峰时 [i,n-1] 的最大值。pre[i]+suffix[i]-maxHeights[i] 的最大值即为所求。
解题代码:
class Solution {
public:
long long maximumSumOfHeights(vector<int>& maxHeights) {
vector<long long> pre=getPreVector(maxHeights);
vector<long long> suffix=getSuffixVector(maxHeights);
long long res=0;
for(int i=0;i<maxHeights.size();i++){
res=max(pre[i]+suffix[i]-maxHeights[i],res);
}
return res;
}
vector<long long> getSuffixVector(vector<int>& maxHeights){
int n=maxHeights.size();
vector<long long> res(n);
stack<int> stack1;
for(int i=n-1;i>=0;i--){
while(!stack1.empty()&& maxHeights[i]<maxHeights[stack1.top()]){
stack1.pop();
}
if(stack1.empty()){
res[i]=(long long)(n-i)*(maxHeights[i]);
}else{
int j=stack1.top();
res[i]=(long long)(j-i)*maxHeights[i]+res[j];
}
stack1.push(i);
}
return res;
}
vector<long long> getPreVector(vector<int>& maxHeights){
vector<long long> res;
stack<int> stack1;
for(int i=0;i<maxHeights.size();i++){
while(!stack1.empty() && maxHeights[i]<maxHeights[stack1.top()]){
stack1.pop();
}
if(stack1.empty()){
res.push_back((i+1)*(long long)maxHeights[i]);
}else{
int j=stack1.top();
res.push_back((i-j)*(long long)maxHeights[i]+res[j]);
}
stack1.push(i);
}
return res;
}
};
总结:
没想出来,看官方题解的。