首先是自己想到了四个分散的元素可以合并,如:
10
1 2 2 1 3 3 1 4 4 1
答案是 3,可以先消 2 再消 4 再消 3。
这个是比较好解决的,观察到只有 4 个长度为 1 的元素块才能这样合并,再记录一个数组记录 3 个长度为 1 的元素块合并的最小代价,可以和之前的数组简单合并得到这种情况的答案。时间复杂度仍然是 O(n3)。
但是查看之前的讨论发现还有其他的 hack 数据:
11
1 2 2 2 1 1 1 3 3 3 1
我的代码输出 4,大概是先把中间的 1 消掉,再把 2,3 消掉,最后再把两侧的 1 消掉。但是存在更优的只用 3 步的解,就是把中间的 3 个 1 拆开变成 2+1,然后这个时候再按原来的策略做就只需要 2 步,具体过程为:
1 2 2 2 1 1 1 3 3 3 1
1 2 2 2 1 1 2 1 3 3 3 1
-> 1 2 2 2 1 (1) 1 2 1 3 3 3 1
1 1 3 3 3 1
这样的话,我们每次可能需要枚举插入什么元素来分隔两段,这样无法保证复杂度。
而且说不一定还有其他的情况可以 hack,因此此题真正的正确做法到底是什么?