对于一些存在数量庞大的子问题的问题,我们可以强制预测答案结构。所谓预测答案结构,即是寻找可行的答案中可能存在的 pattern,也即规律。
比如序列的量化问题,将小于 1000 的自然数组成的序列量化成 s 个自然数组成的序列,且要求最终的误差平方和最小。比如,把序列{1 2 3 4 5}
量化成{2 2 4 4 4}
(s = 2)。
该问题其实蕴含着丰富的子问题,对着这种具有庞大子问题的问题,我们就可以采用强制预测答案结构的方式进行。
- 对于给定序列,那么被相同数值量化的数值一定相邻;
例如,量化 {1, 2, 3, 4}
时,像{2, 2, 3, 2}
形式的答案不可能是最优解。明白了这点,就等于找到了解决此问题的方法:
- 首先对给定序列排序,
- 然后采用适当方式分割出相邻数值组成的数值快;
用相应数值表示每个数值快就可以得到最小误差;
{1, 4, 6, 744, 755, 777, 890, 897, 902}
⇒{{1, 4, 6}, {744, 755, 777}, {890, 897, 902}}
通过以上步骤,原题就变成“把给定序列分割成 s 个数值快”的问题。显然这种问题采用递归调用的方式就可轻松解决,自然每次递归调用时决定第一个数值快的大小。