【贪心算法与动态规划】
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它的特点在于局部最优解能导向全局最优解,但并非所有问题都能保证这一点。在登山法的比喻中,贪心算法就是每次选择最陡峭的路径,期望最终能登上山顶,找到全局最优解。
在例1中,我们需要从一个高精度正整数N中删除S个数字,使得剩余数字组成的新数最小。这是一个典型的贪心问题。由于高精度数字通常以字符串形式存储,我们可以设计一个数组来记录数字是否被删除。贪心策略是尽可能删除高位较大的数字,因为这会使结果数更小。具体实现时,我们从左到右比较相邻的数字,如果高位大于低位,则删除高位数字。但这个策略并不总是有效,例如在实例n2中,需要向前考虑第i-1位与第i+1位的比较,确保删除决策的正确性。
为了设计正确的算法,我们需要通过枚举多个实例来确保策略的全面性。例如,实例n3展示了相邻比较可能无法删除任何数字,这时需要考虑删除远离相邻的数字。实例n4则提示我们在删除数字后,结果中可能出现前导零,这些零需要被删除,除非结果仅包含零,这时至少保留一个零。因此,算法设计应包括初始化、相邻数字的比较与删除、处理删除不足S位的情况以及结果的处理。
算法设计可以分为四个部分:
1. 初始化:创建数据结构来存储数字和删除状态。
2. 相邻数字比较:从左到右比较,若高位大于低位,则标记高位数字为已删除。
3. 处理删除不足S位的情况:如果在相邻比较中删除的数字少于S,需要检查是否需要删除远离相邻的数字。
4. 结果输出:处理结果中的前导零,删除所有零除了最后一个,以得到正确输出。
在实现上,可以采用不同的方法记录和处理删除的数字,比如使用额外的数组记录数字的存在状态或未删除数字的下标。每种方法都有其优缺点,例如,记录存在状态的方法避免了字符移动,但比较和输出过程可能更复杂。
总结来说,贪心算法在解决某些问题时表现出高效性,但其关键在于选择合适的贪心策略,并通过充分的实例分析确保策略的正确性。在实际编程中,要根据问题的具体特点灵活运用,结合动态规划等其他算法策略,以达到最佳解决方案。