int a[N];
pii find(int l, int r)
{
pii ans = { 2e9,0 };
f(i, l, r) { ans.first = min(ans.first, a[i]); ans.second = max(ans.second, a[i]); }
return ans;
}
int get(int l, int r)
{
pii val = find(l, r);
if (val.first == 0)return 0;
if (val.first == val.second)return min(r - l + 1, val.second);
int ans = 0;
int nowl = l, nowr = 0;
f(i, l, r + 1)
{
a[i] -= val.first;
if (a[i] <= 0)//将出现0,递归
{
if (nowr >= nowl) ans += get(nowl, nowr);
nowl = i + 1;//第一个非零
}
else nowr = i;//最后一个非零
}
return min(ans + val.first, r - l + 1);
}
int main()
{
//freopen("in.txt", "r", stdin);
int n;
while (cin >> n)
{
f(i, 1, n)scanf("%d", &a[i]);
int ans = get(1, n);
cout << ans << endl;
}
return 0;
}
C. Painting Fence(递归)
最新推荐文章于 2023-04-30 16:33:40 发布