题解
- 这是一道经典的数学结论问题,先说结论,就是我们剪的长度只有2和3两种,而且2最多为2个,当绳子的长度模3余1时,绳子长度为2个2,其余都是3;模3余2时,有一段是2,其余都是3
- 证明 :当一段 ai >=5 时,那么我们就可以拆分成 (ai-3) *3 = 3 *ai - 9 ,我们假设3 *ai -9 >ai ,那么 2 *ai > 9 -----> ai > 4.5 假设成立 ,现在每段长度都不大于5
- 在看4的情况 ,对于4 ,我们可以拆分成 2 * 2 ,所有也不含有 4 ,因为1 对乘积的贡献值为0 ,所有肯定不会选1 ,现在每段长度都只有2 3
- 假设 有 3 个2 ,那么 2 * 2 *2 < 3 * 3 ,所以长度为6的剪成 3 * 3才是最优的,所以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;
if(n%3==2) res*=2, n-=2;
while(n) res*=3,n-=3;
return res;
}
};