贪心解法
把绳长target剪成i段的最大值为:Math.pow(n, i - c) * Math.pow(n + 1, c)
如:target=8 i=3时,ans=2^1*3^2
然后在剪成2段、3段...x段中取最大值即可。
public class Solution { public int cutRope(int target) { int result = 0; for (int i = 2; i <= target; i++) { int n = target / i, c = target % i; int ans = (int) (Math.pow(n, i - c) * Math.pow(n + 1, c)); if (ans > result) { result = ans; } } return result; } }
DP解法
f[i]表示长度为i的绳子的乘积最大值。
f[i] = Max{f[j]*f[i-j]} 0<j<i
public class Solution { public int cutRope(int target) { int[] dp = new int[target + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= target; i++) { if (i != target) { // 当i!=target时,长度为i的段也可以不分割! dp[i] = i; } for (int j = 1; j < i; j++) { dp[i] = Math.max(dp[i], dp[j] * dp[i - j]); } } return dp[target]; } }