设绳子长度为n, f(n)为最大乘积,以下讨论默认n > 4

  1. 对于长度大于4的绳子,将他剪成更多段,得到的乘积会更大。
    因为对于n > 4, 如果不切,f(n) = n
    如果切为两段,长度分别为2和n-2, f(n) = 2n - 4
    因为 2n - 4 > n 所以任何长度大于4的绳子,都必须剪成更小段。
    所以结论就是,最后绳子分解之后的结果只有2, 3, 4.
    其中分成4,和分成2其实对结果没有影响。
  2. f(n + 1) = f(n) * 3 / 2 (如果f(n)可以被2整除) ............A
    f(n + 1) = f(n) * 4 / 3 (如果f(n)不能被2整除) ............B。
    因为由1我们知道,绳子分解后,有若干长度为2,以及若干长度为3的绳子。
    现在绳子长度加一,那就可以使一个长度2的绳子变成3,或者长度3的绳子变成4。
    显然由2变3,优于由3变4,因为3/2 > 4/3, 但是如果没有长度为2的绳子,就只能由3变4.
    于是得到递推式。
  3. f(n) = 3 * f(n - 3)
    得到递推式A, B后,就已经可以解题了.
    但是注意到,一旦执行了B式,f(n + 1) = f(n) * 4 / 3, 那么f(n + 1)和 f(n + 2)都可以被2除, f(n + 3)不可以被2除,这其实就有循环了。就是BAABAABAA。。。 4/3 * 3/2 * 3/2 = 3.
  4. f(n) = (3 ^ (n / 3)) * f(n % 3) n > 4
    f(0) = 1
    f(1) = 4/3.0
    f(2) = 2
  5. 别人找规律出来的,我真是闲的蛋疼去证明。。。
    class Solution {
    public:
     int cutRope(int number) {
         if(number < 4) return number - 1;
         int x = number / 3, y = number % 3;
         double f[4] = {1, 4/3.0, 2};
         return pow(3, x) * f[y];
     }
    };