leetcode-master/problems/0343.整数拆分.md

1.3 KiB
Raw Blame History

// 拆成两个 还是拆成三个呢

思路

动态规划

  • 明确dp[i]的含义

dp[i]表示 分拆数字i可以得到的最大乘积。

  • dp的初始化

初始化dp[i] = i这里的初始化 不是为了让 i的最大乘积是dp[i]而是为了做递推公式的时候dp[i]可以表示i这个数字好用来做乘法。

  • 递归公式

可以想 dp[i]的最大乘积是怎么得到的呢?

一定是dp[j]的最大乘积 * dp[i - j]的最大乘积那么只需要遍历一下j取值范围[2,i-1)取此时dp[i]的最大值就可以了

递推公式dp[i] = max(dp[i], dp[i - j] * dp[j]);

class Solution {
public:
    int integerBreak(int n) {
        if (n <= 3) return 1 * (n - 1); // 处理 2和3的情况
        int dp[60]; 
        for (int i = 0; i <= n; i++) dp[i] = i; // 初始化 
        for (int i = 4; i <= n ; i++) {
            for (int j = 2; j < i - 1; j++) {
                dp[i] = max(dp[i], dp[i - j] * dp[j]);
            }
        }
        return dp[n];
    }
};

贪心

本题也可以用贪心但是真的需要数学证明证明其合理性网上有很多贪心的代码每次拆成3就可以了代码很简单大家如果感兴趣可以自己去查一查。

我这里就不做证明了。