How to Solve it
How to solve it?
面对未知问题时候,几个个常用办法是
- 把位置问题转化为已知问题,
- 从小而具体的case开始分析,找出规律
- divide and conquer, 假设我们已经解决了一部分问题,so what?
如果能将问题切分为更小的问题,那么只要加上memorization,那就是一个DP解法。 其实backtracking, 枚举也是一种divide and conquer,只不过不是等分。
穷举并剪枝
这是最暴力也是最容易想到的办法,基本思路是可能的线性查找,在可能的解空间树内一个一个做dfs穷举。 如果发现这个leaf一定无解, 早点prune剪枝。
不变量invariant或者monovariant约束
通过构造一个invariant windows, 那么需要确定的事,当加入一个新的元素时, 如何maintain invariant window。 找出每次操作只有的关键变量,利用这个变量来解
DP是数学推导,由上至下只能暴力加cache,有下至上可以优化cache
将问题划分为更小规模的问题,然后利用小规模问题的解推导出大规模问题的解
1) 假设已知部分解法,将已知问题问题加一 “假如我已经知道了0…N范围内的所有解,我能不能利用它们获得N+1的解? 2) 将问题分成两半,然后合并两者结果 假如我已经知道了两个规模为N/2的问题的解,我能不能在O(N)时间内将它们组合成一个规模为N的解?
不要怕穷举,计算的本质就是穷举,先搞出来再考虑优化的可能性
Written on August 10, 2021