1. 程式人生 > >Leetcode 343. 整數拆分(Integer Break)

Leetcode 343. 整數拆分(Integer Break)

給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。

例如,給定 n = 2,返回1(2 = 1 + 1);給定 n = 10,返回36(10 = 3 + 3 + 4)。

注意:你可以假設 不小於2且不大於58。

做題之前是選標籤的,所以直接用動態規劃的思想解題,一般遇到這種題,我會先在草稿紙上列舉前幾個查詢規律.

用dp記錄每個整數n的最大拆分乘積:dp[n] = max(n/i*(n-n/i), n/i*dp[n-n/i], dp[n]),   2 <=i<=n。

演算法細節見程式碼:

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp;
        dp.push_back(0);
        dp.push_back(1);
        for (int i = 2; i <= n; i++)
        {
            dp.push_back(0);
            for (int j = 2; j <= i; j++)
            {
                dp[i] = max((i/j)*dp[i - (i/j)], dp[i]);
                dp[i] = max((i/j)*(i - (i/j)), dp[i]);
            }
        }
        
        return dp[dp.size() - 1];
        
    }
};

編譯通過,瀏覽部落格看看其他的人解法,發現和很多人的思路不一樣,我這個複雜度要高。