(力扣—动态规划)整数拆分
问题描述
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
思想
我知道很多人碰到这种题喜欢找规律,确实有规律,规律就是:能拆成用2组成的就都用2组成,否则就用3。
但是这种问题有规律可循,如果碰到规律不好找的咋办?
所以规律这种事情,除非明眼能看出来的,其余就玩儿玩儿就好。
那这道题怎么用dp解决呢?
这道题的难点在于 我们不知道究竟要将一个数拆成多少份相乘能最大,但是我们知道无论拆成多少份,其和一定是不变的。
也就是说 化繁求简,我们将拆成n(n不确定)份转化成拆成两份,然后各自再拆成两份,直到最后n是1也就是1。
简单点说 比如一个数据n,我们将它拆成 MAX(i) * MAX(n - i),找出结果最大的那个就行了,而MAX(i)、MAX(n - i)分别对应数据以i、n - i为和时最大的结果,MAX(i) * MAX(n - i)就是 i + n - i = n时的乘积最大结果。
所以dp方程是:dp[i] = max(dp[i], max(j, dp[j]) * max(i - j, dp[i - j]))
可能有人不太理解这个dp方程,下面先贴代码,之后再解释
python code
class Solution:
def integerBreak(</