hdu 4381 (多校第9场1002)


这题属于中档偏易题,也就是我感觉我现在已经在赛场上可以做的题.从水题到中档题。这是我dp水平的一个阶段性的改变
所以把做题的过程总结一下我觉得还是很有意义的


题意:n个格子,有一系列操作,每个操作可做可不做,操作A 在[1,ai]中选出xi个黑格子,染成白色,操作B
在[ai,n]中选出xi个黑格子染成白色。求最多可染几个白格子。且为此最少要执行几次操作。
第一步,我们很明显的看到可选的策略就是选择或不选择某个操作.
然后下一步就是选取何种状态表示方法,使得满足无后效性和最优子结构。这也是这题的关键点。
我们再来进一步分析问题。
我们的策略取决于黑白如何分布。这样我们才能知道操作能不能做。如果黑白分布是无规则的,那么要描述这种状态就是很麻烦的。tle是肯定的。所以必须要简化。黑白能够分布的有规律呢?是可以的。
我们发现对于在[1,ai]内选格我们可以每次都从最左边选。[ai,1]也是这样考虑,如此一来我们就可以保证
所涂的格子是由两边到中间推进的。要么全白,要么两边白中间黑。这样我们也会发现可以把两种操作看为连个互补干涉的过程。
如此以来我们的问题就大大简化了。分别考虑两类策略
dpl[i]表示[0,i]全白[i+1,n]全黑时的最少步数。dpr[i]表示[i,n]全白[0,n-1]全黑时的最小步数。
然后两次背包就解决了。
其实到这问题就已经很好的解决了。我们看到在问题的解决的过程就是熵的不断降低。熵降的越低我们的dp方程也就写的也漂亮。
然后还有提一个关于算是编程习惯的问题。这题有两问。一是求最大白格子数,二是求此时最小步数。问题二是在问题一解已求得的的基础上的出的。
推荐得到dpl,dpr后先把问题一搞定了,在利用问题一的解求问题二这样是O(n*n+n)。为什么这样说呢。我比赛时之所以wa到最后就是因为我是两个一块求的。然后最小步数初始化为inf,当白格子数为0时显然最小步数为0,但是我就直接输出inf了。。。就是这么2B的错误。。。
所以。。以后一定要注意把极端数据都测试一边。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值