申请提交题解,递归分治的方法
#include<bits/stdc++.h>
using namespace std;
int a[100001];
int ans;
void finish(int s,int t,int dep){
if(s==t){
ans+=a[s]-dep;
return;
}
if(s>t){
return;
}
int mi=10001;
vector<int> cnt;
for(int i=s;i<=t;i++){
if(mi>a[i]){
mi=a[i];
cnt.clear();
cnt.push_back(i);
}
else if(mi==a[i]){
cnt.push_back(i);
}
}
ans+=mi-dep;
int rs=s;
for(int i=0;i<cnt.size();i++){
finish(rs,cnt[i]-1,mi);
rs=cnt[i]+1;
}
finish(rs,t,mi);
return;
}
int main(){
int n,mi;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
finish(1,n,0);
cout<<ans;
return 0;
}