和整数拆分是同一道题。
动态规划
class Solution {
public int cuttingRope(int n) {
int[] dp = new int[n + 1]; // dp[i]表示长度为i的绳子能得到的最大乘积
dp[2] = 1;
for(int i = 3; i <= n; i++){
for(int j = 2; j < i; j++){
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
}
贪心
每次拆出3是最优的。不过注意4不用拆,拆了反而会变小。
class Solution {
public int cuttingRope(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
int res = 1;
while(n > 4){
n -= 3;
res *= 3;
}
res *= n;
return res;
}
}