Algorithm 算法证明-从n位数中删除k位数后生成最小数

Algorithm 算法证明-从n位数中删除k位数后生成最小数,algorithm,proof,Algorithm,Proof,问题:给定一个n位数字,应删除其中的k(kaj-1并使j最大。 这意味着aj是连续数字递增序列的最后一位(严格来说不是必需的)。 然后数字aj现在从数字中删除,得到的数字m'具有该值 m' = Σi=0,...,j-1 aibi + Σi=j+1,...,n aibi-1 是否有更好的j选择来获得更大的差异 由于an…aj是一个递增的子序列,ai+1≥ 0有效。因此,选择j而不是j,在现在有一个正数的地方会得到更多的零,也就是说,如果存在i和ai+1σi=0,…,j-2(b-1)bi=

问题:给定一个n位数字,应删除其中的k(k 解决方案:删除大于或等于其右邻域的第一个数字(从左到右),如果找不到最后一个数字,则删除最后一个数字。重复此步骤
k
次。(请参阅以供参考。还有其他解决方案,例如,但我认为此处描述的解决方案更直观,因此我更喜欢此解决方案。)


现在的问题是,如何证明上述解决方案是正确的,即如何通过在每一步删除一个数字后使其最小来保证最终数字是最小的。

假设
k=1

m=i=0,…,n aibi
n+1
数字
anan-1…a1a0
带基数
b
,即
0≤ ai
(例如
b=10

证明
∃ j>0
aj>aj-1
并使
j
最大。
这意味着
aj
是连续数字递增序列的最后一位(严格来说不是必需的)。 然后数字
aj
现在从数字中删除,得到的数字
m'
具有该值

m' = Σi=0,...,j-1 aibi + Σi=j+1,...,n aibi-1 是否有更好的
j
选择来获得更大的差异

  • 由于
    an…aj
    是一个递增的子序列,
    ai+1≥ 0
    有效。因此,选择
    j
    而不是
    j
    ,在现在有一个正数的地方会得到更多的零,也就是说,如果存在
    i
    ai+1
    (严格地说更小),则差值不会变大,反而会变小
  • j
    应该是最大值,即
    aj-1-aj<0
    。我们知道 bj-1 > Σi=0,...,j-2(b-1)bi = bi-1-1 bj-1>σi=0,…,j-2(b-1)bi=bi-1-1 这意味着,如果我们选择'j'
如果
∄ j>0
aj>aj-1
上述证明适用于
j=0

还有什么事要做? 这只是证明您的算法适用于
k=1

可以将上述证明扩展到多个子序列(并非严格必要的)递增数字。这是完全相同的证明,但可读性差得多,因为您需要的索引数量太多


也许您也可以使用归纳法,因为数字之间没有交互作用(阻止接下来的选择或其他内容)。

这里有一个简单的参数,您的算法适用于任何k。假设第m位中有一个数字小于或等于其右(m+1)位邻居,则删除第m位,但不删除第(m+1)位。然后,您可以删除第(m+1)位而不是第m位,您将得到一个小于或等于原始答案的答案。

注意:此证明用于在删除k位后建立最大数字,但思路类似

键引理:最大(m+1)-位数包含最大m位数 所有m的编号=0,1,…,n-1

证明:

  • 贪婪的解决方案是从某个数字中删除
    一个
    数字以获得最大值 结果:只需删除
    下一个数字大于它的第一个数字
    ,或者
    如果数字为非升序,则删除最后一个数字
    。这很容易证明
我们用矛盾来证明引理

  • 假设引理第一次在m=k时被破坏,那么
    S(k)⊄ S(k+1)
    。请注意,
    S(k)⊂ S(n)
    由于初始数包含所有次优数,因此必须存在一个
    x
    S(k)⊂ S(x)
    S(k)⊄ S(x-1)
    k+2矛盾
    
    所以,我们证明引理。如果我们得到了
    S(m+1)
    ,并且我们知道
    S(m+1)包含S(m)
    ,那么
    S(m)
    必须是从
    S(m+1)
    中删除一个数字后的
    最大数字。e、 g.从“1028”中删除一个数字,左边的数字是“028”。我想这里可能有一些关于
    k
    的不同引用。是否让
    k
    表示要在参数中删除的数字的位置。这是问题陈述中要删除的总位数,我想@abcaeffshen的答案也是如此。因此,你也给出了一个关于删除我认为的一个数字的论点,在@AbcAeffchen的答案中,这个数字是
    k=1
    。@zhangwt我滥用了k的符号,让它作为删除数字的索引。现在我把索引改为m。该参数应适用于任意数量的k个删除的数字。我仍然不确定多次删除的证明,请参阅@AbcAeffchen的评论。多次删除的正确性证明对我来说是困难的部分,根据你的分析,我会检查它是否与单个删除相同。@zhangwt加上归纳法,你马上就到了结尾:你得到的是最小的数字,少了一个数字。如果
    k>1
    ,则继续执行
    k'=k-1
    。得到一个数字序列,使得数字总是减少1,并且该数字总是通过删除一个数字从上一个数字中得到的最小数字。这证明了你的算法对于
    k>1
    是正确的。我认为在上面的归纳过程中有一个隐含的假设,需要证明。作为归纳范例,假设在
    j(jb)之后,竞争对手
    Aj+1
    不仅包括我们从
    Aj
    中删除一个数字所得到的信息,还包括从任何
    n-j
    数字中删除一个数字所得到的信息,例如
    A'j
    ,即 bj-1 > Σi=0,...,j-2(b-1)bi = bi-1-1