整数拆分求乘积最大(DP)

链接:leetcode
题目:

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
说明: 你可以假设 n 不小于 2 且不大于 58。

方法一:也就是我的第一想法,就是暴力深搜。题解上面有这个解法,也就是说可以。但是具体一点,要有必要的剪枝,加上记忆化搜索。确实是太久没上手做题了,自己想解题思路的时候死活没想到记忆华搜索这回事来。要努力吧!

方法二:这是个数学规律。拆的越多越好,拆成3333***,最后剩一个再乘。

方法三:
真正的方法,DP。
把这个题作为自己的dp回顾题吧。
设dp[i]为把整数 i 拆分得到的最大乘积,则显然,i 可以分为j和(i-j)的和。
首先确定边界:0不可分,1不可分,dp[0]=0, dp[1]=0。
之后再考虑 i ≥2 的情况:
明显可以列出来的一个递归式子为:dp[i] = j * dp[i-j]。
但是还有一种情况,我忘记考虑了的,
j不再拆分,(i-j)也不再拆分了,dp[i] = j * (i-j)。
还有一种情况:dp[i] = dp[j]dp[i-j]。但是不用考虑!这是dp啊,两个dp的相乘,总是会有一个能继续拆下去的,另一个是最优。
综上,递推式:
dp[i]=max{ j
(i-j), j*dp[i-j] }。
然后,另一个重要问题!!!循环!!!
怎么循环呢?
再次想一下这是一个dp题!dp是从每个小步的最优得到总体的最优!我求dp[i]的时候,必须要保证到一件事:dp[1-(i-1)]都已经最优了,这样才能层层地推至dp[i]的最优。所以从最小的2开始考虑循环。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值