"尽可能少地删除数字以使其保持递增顺序"的算法

dra*_*doc 4 arrays algorithm mathematical-optimization

我正在阅读"算法导论:创造性方法"并在第1章中遇到了这个问题:

问题1.3:您有一个数字列表,尽可能少地删除数字以使剩余数字按递增顺序排列.

例如,给定数组

9 44 32 12 7 42 34 92
Run Code Online (Sandbox Code Playgroud)

两个可能的选项是9 12 42 9232 42 92,前者删除的数字较少.

我尝试了一种递归算法,但对其性能不满意,因为它仍然需要测试太多的组合.我发现了一种可以快速获得良好结果的启发式算法,但我不确定它是否可以保证最佳结果.我在网上搜索但没有找到关于这个问题的任何讨论.我相信应该有一个更好的算法.

在这里写了两个方法,以防你想检查.

更新:我问这个问题的解决方案,@ josilber和@templatetypedef提供了链接和正确的方向来查看.事实证明,这是一个具有良好解决方案的已知问题家族的特例.这里没有必要编写详细的解决方案,最长的子序列的维基页面,耐心排序提供了详细信息.

值得注意的是,虽然答案有一些链接,但这个问题并不是要求资源或链接.真正的答案是"这个问题是一些已知解决问题的变体"的知识.

tem*_*def 6

作为提示,这相当于找到数组中增长最长的子序列(你知道为什么吗?)因为这是一个已知O(n log n)解决方案的标准算法,你应该能够通过稍加修改来解决问题LIS.

希望这可以帮助!