leetcode 343. 整数拆分

问题描述

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。

代码

\(dp[i]\)为拆分数字\(i\)获取的最大值,要得到\(dp[i]\)需要遍历所有小于\(i\)的数字,因为这些都是潜在的拆分情况,对于任意小于\(i\)的数字\(j\),首先计算拆分为两个数字的乘积,即\(j\)乘以 \(i-j\),然后是拆分为多个数字的情况,即\(dp[j]*(i-j)\),然后找到最大值即可。

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1,1);
        int i,j;
        //因为n>=2,初始化dp[2]=1,因此从3开始考虑
        for(i = 3; i <= n; i++)
        {
            for(j = 1; j < i; j++)
            {
                dp[i] = max(j*(i-j),max(dp[i],dp[j]*(i-j)));
            }
        }
        return dp[n];
    }
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了57.53%的用户
内存消耗 :6.1 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-03-29 08:30  曲径通霄  阅读(144)  评论(0编辑  收藏  举报