1.思路:本题是在I的基础上做了限定,要求结果求余,所以不能再用动态规划。根据数学证明,绳子剪成多短,每段为3时乘积最大。设n 为绳子长度,n = x * a + b,即将绳子剪为a段,每段x长,余b。b可取0, 1, 2。需要注意的是,b为1时,可以和一个3凑成2 和2,这样乘机会更大。
2.代码:
class Solution {
public int cuttingRope(int n) {
if(n < 4) return n - 1;
long res = 1;
//当n大于4的时候,一直减去3
while(n > 4){
res = res * 3 % 1000000007;
n -= 3;
}
//最后n的取值可能为4, 3, 2, 1
return (int)(res * n % 1000000007);
}
}