题目
给你一根长度为 绳子,请把绳子剪成
段(
、
都是整数,
并且
)。
每段的绳子的长度记为。
可能的最大乘积是多少?
例如当绳子的长度是 时,我们把它剪成长度分别为
、
、
、 的三段,此时得到最大的乘积
。
样例
输入:8
输出:18
思路
(数学)
这道题目是数学中一个很经典的问题。
下面我们给出证明:
首先把一个正整数 拆分成若干正整数只有有限种拆法,所以存在最大乘积。
假设 ,并且
是最大乘积。
- 显然1不会出现在其中;
- 如果对于某个
有
,那么把
拆分成
,我们有
;
- 如果
,拆成
乘积不变,所以不妨假设没有4;
- 如果有三个以上的2,那么
,所以替换成3乘积更大;
- 综上,选用尽量多的
,直到剩下
或者
时,用
。
时间复杂度分析:
当 比较大时,
会被拆分成
个数,我们需要计算这么多次减法和乘法,所以时间复杂度是
。
代码
class Solution {
public:
int maxProductAfterCutting(int n) {
if(n <= 3 ) return 1*(n-1); //边界问题,至少要剪成两段
int res = 1;
if(n % 3 == 1) res = 4 , n -= 4; //将4剪去
else if(n % 3 == 2) res = 2, n -= 2;
while(n)
{
res *= 3;
n -= 3;
}
return res;
}
};
AcWing y总题解