描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
返回值描述:
输出答案。
示例1
输入: 8
返回值: 18
思路:
本题采用 记忆递归法
时间复杂度:O(n^2)
空间复杂度:O(n)
代码
public class Solution { public int cutRope(int target) { if (target == 2) { return 1; } if (target == 3) { return 2; } int [] arr = new int[target+1]; return track(target, arr); } private int track(int target, int [] arr) { if (target <= 4) { return target; } if (arr[target] != 0) { return arr[target]; } int res = 0; for (int i = 1; i < target; i++) { res = max(res, i * track(target-i, arr)); } arr[target] = res; return arr[target]; } private int max(int x, int y) { return x > y ? x : y; } }