核心思想(贪心):将连续的数组A分成三部分,A[l,p],A[p],A[p+1,r],并隐性地对该数组A整体减去A[p],其中A[p]为最小值。对数组A[l,p]和A[p+1,r]如法炮制。
#include <iostream>
using namespace std;
int ans = 0;
void divide(int l, int r, int nums[], int work){
if(l==r) return;
int p = -1;
int minnum = 10010;
for(int i=l; i<r; i++){
if(nums[i] < minnum) {
minnum = nums[i];
p = i;
}
}
ans += minnum - work;
divide(l, p, nums, minnum);
divide(p+1, r, nums, minnum);
}
int main(){
int n;
cin >> n;
int nums[n];
for(int i=0; i<n; i++){
cin >> nums[i];
}
divide(0, n, nums, 0);
cout << ans << endl;
return 0;
}