程式語言 - LeetCode - C++ - 343. Integer Break



題目:


方法:

盡量拆成3,因為最佳拆分接近3

解答一:

class Solution {
public:
    int integerBreak(int n) {
        if (n <= 3) {
            return n - 1;
        }

        int ans = 1;
        while (n > 4) {
            ans *= 3;
            n -= 3;
        }

        return ans * n;
    }
};

方法:

dp[i] = max(
    j * (i - j),    // 拆成兩段
    j * dp[i - j]   // 繼續拆
)

解法二:

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n + 1, 0);

        dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            for (int j = 1; j < i; ++j) {
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
            }
        }

        return dp[n];
    }
};