zoukankan      html  css  js  c++  java
  • 一道证明题

    最近看《剑指Offer第二版》有这么一道面试题:

    题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18。

    书上讲了一种贪婪算法:

    当n≥5时,我们尽可能多地减长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子(其实这时候没必要再减了,只不过题目要求至少剪一刀)。

    首先,当n≥5时,我们可以证明2(n-2)>n并且3(n-3)>n。也就是说,当绳子剩下的长度大于或者等于5的时候,我们就能把它剪成长度为3或者2的绳子段。另外,当n≥5时,3(n-3)≥2(n-2),因此我们应该尽可能多地剪长度为3的绳子段。

    下面是我的思路,首先是基本不等式的推广:
    一般地,若a1,a2,a3,...an是正实数,则有

    [frac{a_1+a_2+a_3+dots+a_n}{n}gesqrt[n]{a_1a_2a_3 dots a_n} ]

    所以可以把这道题转换成下面这个问题:
    已知函数:

    [f(m)=(n/m)^m ]

    当m取几的时候,f(m)最大?条件是m和n/m都是正整数。

    求导一下,得:

    [frac{partial f}{partial m} = {{n^{m}\,ln n+left(-ln m-1 ight)\,n^{m}}over{m^{m}}} ]

    于是可得,当m≤n/e时,函数单调递增;当m≥n/e时,函数单调递减,所以当m=n/e时(此时n/m=e),f(m)取到最大值(e是自然常数)。下面是f(m)的图像:

    但是n/e和e显然不是正整数(条件是m和n/m都是正整数),这时候取离n/e最近的两个整数横坐标就行,但是这时候n/m(也就是每段绳子的长度)不一定是整数!而且之前的大前提是每段绳子长度都相等时才取到最大值(也就是基本不等式中的a1,a2,...都相等时取等号)。这我就很尴尬了。
    没办法,只能换个思路。根据题意可以得出公式:f(n)=max(i×f(n-i)),其中1≤i≤n, n≥1, 且n,i都是整数。这里的i就相当于第一刀剪了长度为i的一段,然后这段就确定了,之后再也不会剪了。
    我们设g(i)=i×f(n-i)
    当i≥5时:
    i×f(n-i)≤(i-2)×2×f(n-i) //因为当i≥5时,有i≤(i-2)×2
    i×f(n-i)≤(i-2)×f(n-i+2) //因为2×f(n-i)=2×f(n-i+2-2)≤f(n-i+2),(因为f(n)=max(i×f(n-i)),这里n取n-i+2,i取2就行了)
    i×f(n-i)≤(i-2)×f(n-(i-2))
    即g(i)≤g(i-2)
    这个结论告诉我们:
    g(3)≥g(5)≥g(7)≥g(9)≥...
    g(4)≥g(6)≥g(8)≥g(10)≥...
    而如果我们能证明g(1)、g(2)、g(4)都小于g(3)的话,那么g(3)就是所有g(i)中最大的。(至于为什么是3,因为一会儿会在g(2)和g(3)中决胜负)
    首先如果g(1)是最大的,那就说明f(n)=1×f(n-1),这样的话对于任意的n, f(n)都相等,显然矛盾。
    其次,g(4) = 2×2×f(n-4) ≤ 2f(n-2) = g(2)
    所以,最终就是要比较g(2)和g(3)谁大,没办法只能祭出大招了,数学归纳法。
    当n=5时,有3f(2) ≥ 2f(3),所以g(3) ≥ g(2)成立
    当n=6时,有3f(3) ≥ 2f(4),所以g(3) ≥ g(2)成立
    假设当n=k时,3f(k-3) ≥ 2f(k-2)成立,从而得到f(k)=3f(k-3)
    n=k+1时,3f(k+1-3) ≥ 2f(k+1-2)成立,即3f(k-2) ≥ 2f(k-1),从而得到f(k+1)=3f(k+1-3)
    当n=k+3时,
    需要证明3f(k+3-3) ≥ 2(k+3-2)
    就是要证明3f(k) ≥ 2(k+1)
    就是要证明3(3f(k-3)) ≥ 2(3f(k+1-3))
    就是要证明3f(k-3) ≥ 2f(k-2)
    证明完毕
    ( 其实还要再手动算个n=7的情况,这样就可以这样推导了:(5,6)=>8 ; (6,7)=>9 ; (7,8)=>10 ; (8,9)=>11 ;...)
    所以现在就可以得到g(3)≥g(i)的结论了,所以f(n)=3f(n-3),因为i≥5,所以n肯定也要≥5。

  • 相关阅读:
    hdu2846 Repository
    Ajax:js自执行函数、jsonp、cros
    python读写Excel文件--使用xlrd模块读取,xlwt模块写入
    CentOS上快速安装saltstack
    Django_Form表单补充
    前端基础之Bootstrap介绍
    前端基础之jquery练习
    前端基础之Http协议
    Django_随机验证码
    dpkg --add-architecture i386 && apt-get update && > apt-get install wine32
  • 原文地址:https://www.cnblogs.com/raytheweak/p/7265646.html
Copyright © 2011-2022 走看看