#918. 【UR #28】偷吃蛋糕 总结
#918. 【UR #28】偷吃蛋糕 总结
一道搜索好题,并没有像“智破连环阵”运用高深的算法进行卡常,却可以通过严谨的证明让搜索成为 \(n\le 2000\) 的正解。
由于笔者水平有限,这只能是总结,不能是题解。
想看题解请去UOJ
启示一:\(n\le 2000\) 也可以用搜索
真的没想到,虽然这道题我有过很多剪枝的思路,但是怎么也想不到 \(n\le 2000\) 是搜索能过了。
只要有了“搜索剪枝”这个方向,我想在 \(4.5h\) 内是可以设计出正解的。(但是证明不了,只能通过造数据测效率)
启示二:分析复杂度也需要用算法
这道题分析 \(\mathcal O(n\sqrt n2^{\sqrt n})\) 的复杂度时需要用到根号分治。这是因为有效的 \(\sum c=n\),和一定的时候考虑根号分治。这与我们"一般出现次数都与根号分治挂钩"的论断相符,因为其本质也是因为出现次数 \(c\) 之和 \(\sum c=n\)。
启示三:当我们能直接计算的时候就应该避免递归枚举
是一个剪枝技巧,可以对效率有很大的提升
启示四:列出一个计算次数的形式化表示后,求复杂度就是在求这个式子的最值
比如我们设 \(f(i)\) 表示递归到 \(i\) 后的计算次数,且分析到 \(f(i)=\max_{j=i+1}^nf(j)\times (j-i)\) 并有 \(f(n)=1\) 求复杂度。
可以理解这个式子的组合意义,可以发现其就是:
\(\begin{aligned}&\max \prod_i x_i\\ \text{st}.&\sum_i x_i=n\\&\forall i,x_i\in \Z\cap [1,n]\end{aligned}\)
根据差小积大的原理,我们应该使得 \(x\) 尽量相同,假设总共有 \(k\) 个数,那么 \(\prod x=k^{\frac nk}\),因为 \(k\in \Z\),当 \(k=3\) 去到最大值 \(\mathcal O(3^{\frac n3})\) 。
这就是第一部分的复杂度分析原理——最大化。
还可以直接列出一个合法状态数的形式化限制,通过 dp 等最优化算法得出其最大值。
网页截图:

这样可以算出搜索上界,但是:

很神奇。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号