與其說是一道算法題,不如說是一道數學題。
自己發現的無證明規律
對於一個數的最佳結果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-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];
}
};