Leetcode 343. 整數拆分(Integer Break)
阿新 • • 發佈:2019-01-06
給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
例如,給定 n = 2,返回1(2 = 1 + 1);給定 n = 10,返回36(10 = 3 + 3 + 4)。
注意:你可以假設 n 不小於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]; } };
編譯通過,瀏覽部落格看看其他的人解法,發現和很多人的思路不一樣,我這個複雜度要高。