给定一个数可以分割成多组和等于它的数组,求这样数组中乘积最大的一组(leetcode343)
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: You may assume that n is not less than 2 and not larger than 58.
思路:动态规划的练习题。对于n这个数的f(n),即是求1*f(n-1),2*f(n-2)......等中最大的一种情况,可见其适用与动态规划(具有重叠子问题和最优子结构)。对应的可以先用递归,记忆化搜索解题,再到动态规划。
递归记忆化搜索
class Solution { int[] memo; public int helper(int n) { if(n == 1){ return 1; } if(memo[n] !=0 ){ return memo[n]; } int res = 0; for(int i = 1; i < n; i++){ res = Math.max(res, Math.max(i*(n-i), i*helper(n-i))); } memo[n] = res; return res; } public int integerBreak(int n) { memo = new int[n+1]; return helper(n); } }
动态规划:
public int integerBreak(int n) { int[] memo2 = new int[n+1]; memo2[0] = 1; memo2[1] = 1; //从2开始到n 计算其的最大乘积 for (int i = 2; i <= n; i++) { for (int j = 1; j < i; j++) { memo2[i] = Math.max(memo2[i], Math.max(j*(i-j), j*memo2[i-j])); } } return memo2[n]; }
转载请标明出处:常见算法 - 将给定整数分解成多个和为其的数,求乘积最大的一组数