阅读 43

CF1497E2 Square-free division (hard version)

我知道状态应该设计为dp (i,k)来表示当前转移到第i位,使用了k次机会。

但是有一个深深的困扰。

贪心地,我把改的数字枚举成了1,但我设计转移方程的时候,我是一个数一个数的讨论要不要加入的。

这样会出现bug:我可以用hash判断能不能加入,但没法实现修改这个功能,也就是说,假设我不能加入了,

但我选择了修改,改成1,那么在后面继续转移的时候,这个修改就没法起作用,因为我不可能记下每时每刻动态的序列。

题解的做法是枚举修改的区间,在使得它的转移是整段整段的,这样可以保证每次枚举都是从断点开始,k也好操作了。

那么时间会不会超时呢?

如果可以预处理出对于当前的这个点来说,往前修改x次后,可以得到的最远长度就好了。

记录修改x次后能一路往前直到j点。

那么答案是dp i,k=min ( dp i,k     ,dp j,k-x  +1  );

为什么要记最远?贪心~

枚举i,枚举k,复杂度大概是10五次方乘20;

预处理的操作其实也是一种dp。

如果当前数字能加入,就继承前一个,如果不能加入,就把自己改成1,消耗次数+1;

可能有点瑕疵,标解的做法是双指针,,

现在歌单放到了凤凰花开的路口,还有四季予你,我想到了几个在我生命里留下过痕迹但再也没有理由出现的人

完整的ac和报告待会吧。

 

但是,dp有奇奇怪怪的优化,顺序,预处理,综合题,这正是我喜欢它的地方,永远新鲜。

 

原文:https://www.cnblogs.com/liyishui2003/p/15309672.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐