Leetcode-343 整數拆分

題目鏈接

與其說是一道算法題,不如說是一道數學題。

自己發現的無證明規律

對於一個數的最佳結果dp[n] 往往是dp[均分],或者均分附近的值相乘。
本質上其實是考慮了2,3爲因子的可能。

class Solution {
public:
    int integerBreak(int n) {
        if(n==2||n==3) return n-1;
        vector<int> dp(n+1,1);
        dp[2]=2;
        dp[3]=3;
        for(int i=4;i<=n;i++)
        {
            if(i%2==0)
                dp[i]=max(dp[i/2]*dp[i/2],dp[i/2-1]*dp[i/2+1]);
            else
                dp[i]=max(dp[i/2]*dp[i/2+1],dp[i/2-1]*dp[i/2+2]);
        }
        return dp[n];
    }
};

貪心

根據貪心算法,就儘量將原數拆成更多的 3,然後再拆成更多的 2,保證拆出來的整數的乘積結果最大。
但是注意與其拆成3*1不如拆成2*2。

class Solution {
public:
    int integerBreak(int n) {
        if(n==2||n==3) return n-1;
        int a=n/3;
        int b=n%3;
        if(b==0)
            return pow(3,a);
        else if(b==1)
            return pow(3,a-1)*4;
        else   
            return pow(3,a)*2;
    }
};

DP
F(N)=max{iF(Ni)},i=1,2,...,n1 F(N)=max\{i*F(N-i)\} ,i=1,2,...,n−1

存在F(N-i)<N-i的情況,因此都需要考慮。

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1,1);
        for(int i=3;i<=n;i++)
        {
            for(int j=i-1;j>=1;j--)
                dp[i]=max(dp[i],max(dp[j]*(i-j),j*(i-j)));
        }
        return dp[n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章