[DP]343. Integer Break

题目:

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

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


题目分析:

1、根据题意,我们需要将给出的N(1<N<59)拆分成至少两个数,使其和为N,且要尽量让其乘积最大;

2、首先根据例举一些简单的数的积最大拆分我们可以发现,除了2和3以外(因为至少要拆分为两个数),别的数要使其拆分后积最大,就要将其拆分为2和3组成的和(且尽可能有多的3)。因此算法就变得很简单了,只需要N/3统计能拆分为多少个3,再根据N%3来判断是否能拆成完全的2和3的组合(余数为0则全为3,余数为2则有一个2,余数为1则须减少一个3改为两个2);

代码:

#include<cmath>
class Solution {
public:
    int integerBreak(int n) {
        if(n == 2) return 1;
        if(n == 3) return 2;
        
        int p = n/3;
        if(n % 3 == 0)
            return pow(3, p);
        else if(n % 3 == 1)
            return pow(3, p - 1) * 4;
        else
            return pow(3, p) * 2;
    }
};

3、对上述算法进行理论上的分析:

     首先对于2和3来说,它们符合拆分为尽可能多的3,剩下的为2的算法过程和结论(不考虑必须拆分为至少两个数的限制)。

     对于大于3任意数N而言,假设它已经被拆分为3和2的和的形式,如果有一个更优解(和式包含不为2或3的数N0),那么N0本身也可以被表示为2和3的和式,也就是说这个最优解利用N0替换表示N的2和3的和式中的一部分,已达到更大的乘积,假设N0 = 3m + 2n,那么N0 > 3^m + 2^n即3m + 2n > 3^m + 2^n,显然式子在m, n > 1时不可能成立。所以推翻了又更优解的可能。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值