LeetCode 343 整数拆分
给定一个正整数 n
,将其拆分为 k
个正整数的和( k
>= 2 ),并使这些整数的乘积最大化。
返回你可以获得的最大乘积 。
动态规划
此处使用动态规划求解,首先需要确定的是问题的划分,对于整数 n
拆分的方式存在多种 1+n-1
或 2+n-2
,同时也可以进一步对 n-1
和 n-2
进行拆分,此处使用一个动态规划数组 dp[i]
来表示,将数字 i
拆分为任意份后能够得到的最大乘积,那么对于数字 n
的拆分为
两个值都拆分的情形
在此基础上将 和 进一步拆分为多个值的最大值 。 两个值都不进行拆分的情况:
两个值都不进行拆分,那么 两个值一个拆分,另一个不拆分:
对 进行拆分 $n^3_{最大乘积}=dp[n-i]i i n^4_{最大乘积}=(n-i)dp[i]$
在此基础上得到递推公式为:
其中
在上述基础上使用动态规划求解:
确定动态规划数组及其含义:使用长度为
n
的动态规划数组dp[n+1]
其中dp[i]
表示数字i
对应的最大乘积值确定递推公式:
其中 动态规划数组的初始化:
dp[0]=0,dp[1]=0
动态规划数组的遍历顺序:在推导
dp[i]
时,需要使用到前述的前部元素,从前向后推导。举例实现:
n=3
那么dp[2]=max(max(dp[1]*dp[1],1*1,dp[1]*1,1*dp[1]))=1
,再计算dp[3]=max(max(dp[2]*dp[1],2*1,dp[2]*1,2*dp[1]))=2
,计算正确。
代码实现:
1 | class Solution { |
此处的拆分的情况还可以进行进一步的合并:对于两个数都拆分和两个数中仅拆分一个实际上是相同的。对于数字
1 | class Solution { |