设绳子长度为n, f(n)为最大乘积,以下讨论默认n > 4
- 对于长度大于4的绳子,将他剪成更多段,得到的乘积会更大。
因为对于n > 4, 如果不切,f(n) = n
如果切为两段,长度分别为2和n-2, f(n) = 2n - 4
因为 2n - 4 > n 所以任何长度大于4的绳子,都必须剪成更小段。
所以结论就是,最后绳子分解之后的结果只有2, 3, 4.
其中分成4,和分成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.
于是得到递推式。 - 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. - f(n) = (3 ^ (n / 3)) * f(n % 3) n > 4
f(0) = 1
f(1) = 4/3.0
f(2) = 2 - 别人找规律出来的,我真是闲的蛋疼去证明。。。
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]; } };