Loading

#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 等最优化算法得出其最大值。

网页截图:

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

很神奇。

posted @ 2025-02-25 16:12  lupengheyyds  阅读(26)  评论(0)    收藏  举报