Dynamic Programing -- Leetcode problem 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.

  • 分析:这道题是给定一个大于二的整数来对它进行拆分,要求拆分后的数的乘积最大。
  • 思路一:枚举法。
class Solution {
public:
    int integerBreak(int n) {  
        int max = 1;  
        for(int i=2; i<n; i++) {  
            int product = 1;  
            int m=n/i, remain = n-n/i*i;  
            for(int j=0; j<i; j++) {  
                if (remain == 0) {  
                    product *= m;  
                } else {  
                    product *= m + 1;  
                    remain --;  
                }  
            }
            if (product < max) break;  
            max = product;  

        }  
        return max;  
    }  
};
  • 思路二:找规律。这道题在寻找数字之和的时候是有规律可循的,我们可以尝试去寻找这种规律。首先写几个数来尝试一下:
    2 = 1+1,1*1 = 1;
    3 = 1+2,1*2 = 2;
    4 = 2+2,2*2 = 4;
    5 = 2+3,3*2 = 6;
    6 = 3+3,3*3 = 9;
    7 = 3+4,3*4 = 12;
    8 = 3+3+2,3*3*2 = 18;
    9 = 3+3+3,3*3*3 = 27;
    10 = 3+3+4,3*3*4 = 36;
    可以看到3这个数字在拆分的过程中非常特殊,对于一个数(这个数大于4)而言,在拆分它的过程中要首先考虑拆出3,直到剩下的数为2或4(由于2*2=4,因此将4拆为2*2是没有必要的),由此可以进行编程。
class Solution {
public:
    int integerBreak(int n) {  
        if (n == 2 || n == 3) return n - 1;
        int res = 1;
        while (n > 4) {
            res *= 3;
            n -= 3;
        }
        return res * n; 
    }  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值