【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)\)

posted @ 2018-05-24 13:33  ONION_CYC  阅读(146)  评论(0编辑  收藏  举报