Integer Break

Given a positive integer n, break it into the sum of at leasttwo positive integers and maximize the product of those integers. Return the maximum product you can get.

Example 1:

Input: 2
Output: 1
Explanation: 2 = 1 + 1, 1 × 1 = 1.

Example 2:

Input: 10
Output: 36
Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
/* n分解为至少2个数的和 然后求这些分解中乘积最大的那种
 * 如果是dp[i] 表示i拆分得到的最大结果
 * 外循环 考虑数 内循环考虑拆分位置
 * */
class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1, 0);
        for(int i=2;i<=n;i++){
            for(int j=1;j<i;j++){
                dp[i] = max(dp[i], j*max(i-j, dp[i-j]));
            }
        }
        return dp[n];
    }
};

这道题其实是数学问题 

如果按实数x拆分 总和sum 等价于max(x^{\frac{sum}{x}}) 求导后x=e 那x取整数就考虑为2 or 3

当sum> 一定值时 按3拆分大于按2拆分得到的结果

验证一组数后 sum>=5 时拆分为3和一个小于3的数最好

class Solution {
public:
    int integerBreak(int n) {
        int ret[5]={0,0,1,2,4};
        if(n<5) return ret[n];
        n -= 5;
        return (int)pow(3, (n / 3 + 1)) * (n % 3 + 2);
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值