给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36 提示: 2 <= n <= 58 解题方法——贪心算法:
1 class Solution { 2 public int cuttingRope(int n) { 3 4 //3为最优解所以尽可能的多剪3 5 //当余数为2时直接乘 6 //当余数为1时,避免浪费化1+3为4 7 int a = n/3, b = n%3; 8 //n<=3时因为m>1所以一刀两断 9 if(n <= 3) return n - 1; 10 if(b == 2) return (int) Math.pow(3,a) * 2; 11 if(b == 1) return (int) Math.pow(3,a-1) * 4; 12 else return (int) Math.pow(3,a); 13 14 } 15 }
解题方法——动态规划
1 class Solution { 2 public int cuttingRope(int n) { 3 if (n < 4) return n - 1; 4 int p = 2, q = 3, r = 4, temp; 5 for (int i = 5; i <= n; i++) { 6 temp = p; 7 p = q; 8 q = r; 9 r = Math.max(2 * p, 3 * temp); 10 } 11 return r; 12 } 13 }
标签:示例,int,绳子,class,长度,public From: https://www.cnblogs.com/wuli-Zhang/p/17181919.html