• 算法第四章实践


    1.实践题目:

    4-2 删数问题 (110 分)

     
    2.问题描述:

    给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

    4-2 删数问题 (110 分)
     

    给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

    输入格式:

    第 1 行是1 个正整数 a。第 2 行是正整数k。

    输出格式:

    输出最小数。

    输入样例:

    在这里给出一组输入。例如:

    178543 
    4 
    

    输出样例:

    在这里给出相应的输出。例如:

    13


    3.算法描述:

    因为给的数字会特别大,用string a来记录数字,记n为要删除的个数,记len每次删除字符后字符串的个数。循环删除个数次,每次只找一次逆序对将高位删去(高位比低位大,就将高位删去),删除高位的方法:将高位后面的所有数字依次前移;如果没找到,就什么也不做。每次循环len减一。接着找到一个非0数字,依次输出;如果都是0,则输出0。

    利用反证法证明贪心选择和最优子结构性质:

    设有一个n位的数a,用ai表示这个n位数的第i位,(如:若a=945,则a1 = 9,a2 = 4),贪心选择是从这个n位数里找第一个逆序对,将高位删除,若找不到逆序对则删除最后一位。利用反证法:若数a有逆序对则不删除第一个逆序对的高位,删除除开第一个逆序对的高位的任意一个数字①;如果数a没有逆序对,则删除除开最后一位的任意一个数字②。

    对于情况①:

      若存在逆序对,不失一般性的假设第一个逆序对的高位在ak,删除除开ak的任意一个数字,有两种情况,删除数字ai,i < k 和 i > k。则对这两种情况都进行讨论:

      1. 对于情况删除数字ai,i < k:令删除数字ai后,则该数组成为α:a1,a2,...ai-1,ai+1,ai+2,...ak,ak+1,...,an。若删除删除的是ak,令该数组成为β:a1,a2,...ai-1,ai,ai+1,ai+1,...ak-1,ak+1,...,an。对比两个数字,显然a1,a2,...ai-1和ak+1,...,an这两个区间段一致,只用比较ai+1,ai+2,...ak和ai,ai+1,ai+1,...ak-1这一段。由于第一个逆序对的高位在ak,那么a1,a2,...ak-1都是单调非减的,一定有ai+1 > ai,α大于β,故删除数字ai,i < k的情况不成立。

      2. 对于第二种情况删除数字ai,i > k:令删除数字ai后,则该数组成为α:a1,a2,...ak,ak+1,...,ai-1,ai+1,ai+2....an。若删除删除的是ak,令该数组成为β:a1,a2,...ak-1,ak+1,...,ai,ai+1,...an。对比两个数字,显然a1,a2,...ak-1和ai+1,ai+2....an这两个区间段一致,则只用比较ak,ak+1,...,ai-1和ak+1,...,ai,由于第一个逆序对的高位在ak,则ak一定大于ak+1,则一定有α大于β,故删除数字ai,i < k的情况不成立。

    对于情况②:

      若果数a没有逆序对,则删除除开最后一位的任意一个数字。不失一般性的假设删除的数字为ai(i≠n)

      则令删除ai(i≠n)后数组成为α:a1,a2,....ai-1,ai+1,...an。令删除an后数组成为β:a1,a2,....ai-1,ai,ai+1,...an-1。显然a1,a2,....ai-1这一区间段一致,只需比较α的ai+1和β的ai,因为不存在逆序对,所以数a是单调非增的,一定存在有α的ak+1 > β的ak(其中k >= i),故一定有α大于β,故如果数a没有逆序对,则删除除开最后一位的任意一个数字,情况不成立。

    最优子结构性质证明:

    令有数字a有n位,队列R记录未删除的位数,队列D记录删除的位数,如:若a有3位,一开始R={a1,a2,a3} D={Φ},假如删除了a1,那么此时R = {a2, a3} D = {a1}。

    假设数字a有n位,需要删除的个数为k,假设进行到了第i次删除(1 <= i < k)记此时的未删除的位数集合为Ri,删除的位数集合为Di,那么 ||Ri|| = n - i, ||Di|| = i,那么进行i+1次删除操作时,假设贪心选择结果为aj 显然有Ri+1 = Ri - {aj},Di+1 = Di ∪ {aj},假设若有Di+1 ≠ Di ∪ {aj},又因为aj∈ Di+1,假设此时有另一个Di'(||Di’|| = i,Di' ≠ Di),则Di+1 = Di’ ∪ {aj},不失一般性的假设存在有队列Di'的第m个数Di'[m]与Di[m]不同,那么在第m次修改时,只有修改了Di[m]才能符合贪心选择,其余的修改,如Di'[m],都不符合贪心选择,所以假设Di+1 ≠ Di ∪ {aj} 不成立。证毕。(请问我,我写的啥???)

    算法时间及空间复杂度分析:

      因为需要循环删除次数次,每次循环要遍历一遍数组,若果找到逆序对还要删除前移,所以时间复杂度为O(n^3)

      空间复杂度分析,没有开辟辅助空间,所以为O(1)

    心得体会(对本次实践收获及疑惑进行总结):

      第一题和第三题很快就写完了,写第二题写的人憔悴。。。在解题上找到贪心策略是解题的关键。

    (我觉得没有人能看懂的。。。)

  • 相关阅读:
    HDU 3714 Error Curves【三分查找】【经典题】
    HDU 3714 Error Curves【三分查找】【经典题】
    HDU 3711 Binary Number【水题】【bitset】
    HDU 3711 Binary Number【水题】【bitset】
    HDU 4689 Derangement【DP递推】【好题】【思维题】
    HDU 4689 Derangement【DP递推】【好题】【思维题】
    HDU 4055 Number String【DP递推+递推优化】【好题】
    HDU 4055 Number String【DP递推+递推优化】【好题】
    HDU 4054 Hexadecimal View【模拟】【字符串处理】
    HDU 4054 Hexadecimal View【模拟】【字符串处理】
  • 原文地址:https://www.cnblogs.com/likeghee/p/11878478.html
Copyright © 2020-2023  润新知