LeetCode | 343. Integer Break Dp

Given a positive integer n, break it into the sum of atleast two positive integersand maximize the product of those integers. Return the maximum product you canget.

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 isnot less than 2 and not larger than 58.

Credits:
Special thanks to 
@jianchao.li.fighter for adding this problem and creatingall test cases.

这一题一般的解法为使用DP,建立一个数组Dp,Dp[i]表示数字i拆分成至少两个数这些数的积中最大的一个值,这里需要注意的是,Dp[2] = 0,因为2不能拆分成两个数,然后可以得到递归关系,Dp[n] = max(Dp[n - t] * t,(n – t) * t) :  t = 1,2,3…n-1

这里之所以有两项是因为Dp[n – t]表示的是n – t拆分成至少两项之后最大的乘积,并不包括把n – t刚好拆分成两项的乘积,Dp[n -t] * t表示的是把n拆分成至少三项之后的最大乘积,并不包括把n拆分成两项之后的最大乘积

class Solution(object):
    def integerBreak(self, n):
        tmp = 0
        ttmp = 0
        dp = [0 for i in range(60)]
        dp[1] = 0
        dp[2] = 1
        for i in range(3, n + 1):
            for j in range(1, n):
                tmp = max((i - j) * j, dp[i - j] * j)
                ttmp = max(tmp, ttmp)
            dp[i] = ttmp
        return dp[n]

不过这一题还有一个最简便的方法,就是可以证明n拆分成多个数之后,要使得他的乘积最大,拆分成的每个数都只能是2或者是3,因为有这么个公式(a1 + a2+…an)/n >= 2√(a1 * a2 * a3… * an),

也就是说把,把n拆分成相等的数的时候乘积最大

假设拆分之后的每个数都是x,

则q(x) = x^(n / x),q(m)的导数为n * xn/x-2 * (1 - ln(x)).

可以知道,当x为e也就是大约2.7的时候积最大,但是x只能是整数,所以x只能是2或者是3

不过这种方法比赛中肯定想不出来,只能是算作拓展知识点


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值