【DP优化】 铁塔分组

铁塔(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]也满足

 

自扰一波。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值