题目
[CodeFoeces 1400E] Clear the Multiset
分析
找到区间最小值断开分治,然后返回两种操作的代价较小值即可。
代码
#include <bits/stdc++.h>
int Read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9')
x = x * 10 + (c ^ 48), c = getchar();
return x;
}
typedef long long LL;
const int MAXN = 5000;
const int INF = 0x3f3f3f3f;
int N, A[MAXN + 5];
int Solve(int l, int r) {
if (l > r) return 0;
int c = INF, p = 0;
for (int i = l; i <= r; i++)
if (A[i] < c)
c = A[p = i];
for (int i = l; i <= r; i++)
A[i] -= c;
return std::min(r - l + 1, Solve(l, p - 1) + Solve(p + 1, r) + c);
}
int main() {
N = Read();
for (int i = 1; i <= N; i++)
A[i] = Read();
printf("%d", Solve(1, N));
return 0;
}