第四章作业
删数问题分析
-
贪心策略
从左向右扫描数字字符串,维护一个单调非递减栈。遍历过程中,如果栈顶数字大于当前待处理数字,删除栈顶字符(待删除次数k减1),重复该操作直到栈顶数字小于等于当前数字或者k等于0,再将当前数字入栈。字符串遍历结束后,如果k仍然大于0,说明剩余序列已经单调递增,直接删除末尾k个字符。最后去掉结果中的前导0,若结果全为0则输出0。 -
贪心选择性质证明(反证法)
设原数字串为s,找到第一个满足s[i]>s[i+1]的位置i,贪心选择为删除s[i]。假设不存在任何全局最优解包含该贪心选择,即所有最优方案都不删除s[i]。
情况一:最优解删除的位置j在i之前。由于i是第一个s[i]>s[i+1]的位置,下标0到i之间的数字单调不减,删除前面位置的字符无法得到更小的数,该方案不可能优于删除s[i]的方案,矛盾。
情况二:最优解删除的位置j在i之后。我们构造一个新方案,将原最优解中删除j改为删除i,其余删除位置保持不变。因为s[i]处于更高位且s[i]>s[i+1],替换之后得到的数字会比原最优解更小,和原方案是最优解的前提矛盾。
综上假设不成立,一定存在全局最优解包含本次贪心选择,该算法满足贪心选择性质。同时原问题的最优解包含子问题的最优解,满足最优子结构。 -
时间复杂度分析
设字符串长度为n,每个字符最多入栈一次、出栈一次,入栈和出栈操作总共最多执行n次。整体时间复杂度为O(n);栈存储结果,空间复杂度为O(n)。 -
对贪心算法的理解
贪心算法在每一步选择当前局部最优的方案,通过一系列局部最优选择最终得到全局最优解。贪心算法成立需要两个条件:贪心选择性质和最优子结构。贪心算法计算效率高,不需要枚举所有状态;但它有很强的局限性,不是所有问题都适合贪心求解,使用前必须证明贪心选择性质,仅凭直观想法容易出错。例如0-1背包问题就不满足贪心选择性质,不能使用贪心,需要动态规划求解。

浙公网安备 33010602011771号