给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-break
思路:
列出来前面的一些,找规律,看后面的是怎么来的
1 - 0 2 - 1 3 - 2 4 - 4 5 - 6 6 - 9 7 - 12 8 - 18 9 - 27 10 - 36
到7之前的都是分解成两位3* 4 3 * 3 2 * 3之类的,到8开始发生了变化是 2 * (6对应的值)
所以要么比较j * (i - j ),要么比较 j * dp[ i - j]
class Solution { //递归-自顶向下 public int integerBreak(int n) { int[] dp = new int[n + 1]; dp[2] = 1; for(int i = 2;i <= n;i++){ for(int j = 1;j <= i - 1;j++){ int a = j * dp[i - j]; int b = j * (i - j); dp[i] = Math.max(dp[i], Math.max(a,b)); } } return dp[n]; } }