剪绳子(1)
题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述::
返回值
示例:
输入: 8
输出:18
分析思路一:
这个思路是评论里看的比较简洁的版本,但是自己很难想到,所以后期整理的时候,十分的。。。怀疑自己。所以后面会整理个正常的动态规划版本。
1:首先是一个问题,当确定一个绳子周长的时候,怎样使得长方形的面积最大。
通过计算,当定长时候,截得长度相等时候,乘积最大。
下面这句话不太懂:
(通用性待数学求证)
基本不等式的定理可知:算术平均数 > 几何平均数
2:回归本题得计算,题目绳子长度为n,分成m段,每段为x,则m=n/x;
特殊值带入可以得到f3>f2;
得到每段为3时,乘积最大。
class Solution { public: int cutRope(int number) { if(number<1) return 0; if(number==1||number==2) return 1; if(number==3) return 2; int w = number%3; switch(w){ case 0 : return (int) pow(3,number/3); case 1: return (int) pow(3,number/3 -1)*4; case 2: return (int) pow(3,number/3)*2; } return 0; } };