[DP]343. Integer Break

来源:互联网 发布:软件下载站模板 编辑:程序博客网 时间:2024/06/05 19:52

题目:

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时不可能成立。所以推翻了又更优解的可能。