按着题目分类往下做,做到这一题的时候,上面说是要加数据结构的优化。
不过我随便想想,发现个贪心策略,可以把复杂度降很低。
我当时想的贪心策略是:假设num[i]...num[i]是一段,如果num[i]+...num[j]+num[j+1]<=M,则把num[j+1]直接加到前面一段上去。其他的部分按照常规DP。
我就按照这个思路写,提交后无限WA。在网上找了个正确的程序来手工对拍,跑了n组随机数据答案都是一样的,但只要一提交就是WA。后来,我不仅打印答案,还把中间数据全都给打印了出来,才终于找到了问题。之前那个贪心是错误的,还要加上一个限制条件。
假设num[i]...num[i]是一段,并且num[i]+...num[j]+num[j+1]<=M
如果 max(num[i]...num[j])>=num[j+1] ,则把num[j+1]直接加到前面一段上去。
否则重新搜索该段的起始节点,可以直接从i开始往前搜索。
没有加什么数据结构优化,跑390ms,勉强凑合。