常见算法 - 将给定整数分解成多个和为其的数,求乘积最大的一组数

匿名 (未验证) 提交于 2019-12-03 00:18:01

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!