铁塔(tower)
【题目描述】Rainbow 和 Freda 要在 Poetic Island 市的一座山脚下盖房子定居了……盖房子需要钢材,幸运的是,这里有排成一行的n座废弃的铁塔,从左到右编号为1~n,其中
第 i 座的高度为h [ i ]。
Rainbow 和 Freda 想盖一座上面小下面大的城堡,并且城堡的层数尽可能多。因此,
他们要把这些铁塔分成尽量多组,每组内的铁塔编号必须是连续的,并且从左到右
各组内铁塔的高度之和单调不减。
但是 Rainbow和 Freda 简直弱爆了有木有,于是请你帮忙计算一下最多能分成多少
组呢?
【输入格式】
第一行一个整数 n 。
第二行 n 个整数,第 i 个整数表示h [ i ]。
【输出格式】
输出一个整数,表示( n − 最多能分成的组数)
【样例输入】
8
1 9 9 4 1 2 2 9
【样例输出】
3
提示
【数据范围】
0 < n ≤ 200000,0 < h[ i ] ≤ 2147483647
分析:
附上题解:
本题不能贪心。
前面的组越小并不是最好的。
比如4 2 6 7 7 7 7
第一组如果是4,则只能分4组。
如果第一组取4和2,则可以分6组。
这题是个DP
最开始的裸的转移复杂度?∗?,用?[?]表示前?项ℎ[?]的和;?[?]表示到i最多的分组数;?[?]表示在?[?]最大时,这一组最小的和;循环? =1到?;从小于?的里面找满足?[?]−?[?]≥?[?]的?来转移?[?]=?[?]+1;
然后开始优化,如果有?1和?2都可以转移?且?1<?2;那么一定用?2转移;因为?[?2]一定≥?[?1](因为至少可以把?2到?1−1这一段并到?1那一组里,此时相等;如果这一段的和>?[?1]的话?[?2]=?[?1]+1;)所以?2当前会比?1优;而且?[?]−?[?2]<?[?]−?[?1]所以?[?]也会较小;对整体也更优;如果?2存在;?1就永远不会被用到了
将?[?]−?[?]≥?[?]的转移条件变成?[?]+?[?]≤?[?];
1. 如果?2存在;?1就不会被用到了;所以对于一个?来说;所有之前?[?]+?[?]≥?[?]+?[?]的?就没用了;
2. 在可以转移?的若干?中一定会选择最靠后的一个
3. 决策是单调的而且可以转移?的一定可以转移?+1;
用单调队列
维护?[?]+?[?]随序号递增的序列;每次从队头一直找可以更新?的值;用最后一个也就是标号最大的一个更新?;再把?入队;将比?差的出队
ok,看完(懂)题解之后,我的脑子莫名其妙抽了一下,想到一个奇怪的问题:
倘若 f[i] 可以由 f[j] 转移(s[i]-s[j]>=g[j]), 如果存在一个j',使得f[j']>f[j]但是s[i]-s[j']<g[j'],此时如果f[j']变为f[j']-1,g[j']随之减小的话,f[i]从j'转移就会使得g[i]更优啊
说的通俗一点,就是是否存在一段1~k,使得当它分为t组时最后一组为g1,分为t+1组时最后一组为g2,同时g1<g2
可以证明这样的情况不存在,即当同一段分组减少时,g单调不减。
有两种证法:
一:
法二:
假设i之前的点都满足f[k]最大的同时g[k]最小,那么当f[i]调小时,由于f单调不递减,所以转移到i的点j一定会前移,与之对应求出的g[i]就会变大,所以当f[i]取到最大值时,g[i]同时取到最小值。
由数学归纳法知,因为f[1]=1,g[1]=a[1]是定的(即满足f[1]最大的同时g[i]最小),所以f[2],f[3]...f[i]也满足
自扰一波。。。。