【51Nod】1519 拆方块 贪心+递推

【题目】1519 拆方块
【题意】给定n个正整数,(A_i)表示第i堆叠了(A_i)个石子。每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除。(n leq 10^5)
【算法】贪心+递推
观察每轮操作的变化:

$$A_i=min { A_i-1,A_{i-1},A_{i+1} } $$

继续推导,因为每一轮要么-1要么取左右,那么也就是一个数传递到另一个位置要加上它们之间距离的代价(一轮一格,每轮少一个 -1 ),也就是每个数字都可以更新为:

$$A_x=min_{i=1}^{n} { A_i+|x-i| } $$

这样直接从左到右和从右到左分别递推一次即可。
最后两端的石子相当于最左和最右各有一堆高度为0的石子,递推的时候处理就可以了,答案就是所有数字的最大值。
复杂度(O(n))

原文地址:https://www.cnblogs.com/onioncyc/p/9082442.html