动态规划练习:
给定一个数可以分割成多组和等于它的数组,求这样数组中乘积最大的一组(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];
}