递归。分治。
。
。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn=5500; typedef long long int LL; typedef pair<int,int> pII; LL f[maxn],n; LL solve(int l,int r) { LL mx=9999999999; vector<pII> pi; for(int i=l;i<=r;i++) mx=min(mx,f[i]); bool flag=false; int duan[2]; for(int i=l;i<=r;i++) { f[i]-=mx; if(f[i]) { if(flag==false) { flag=true; duan[0]=i; } } else if(f[i]==0) { if(flag==true) { flag=false; duan[1]=i-1; pi.push_back((make_pair(duan[0],duan[1]))); } } } if(flag==true) { flag=false; duan[1]=r; pi.push_back((make_pair(duan[0],duan[1]))); } LL digui=0; int sz=pi.size(); for(int i=0;i<sz;i++) { digui+=solve(pi[i].first,pi[i].second);; } return min((LL)(r-l+1),digui+mx); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i]; cout<<solve(1,n)<<endl; return 0; }