一,问题描述
二,问题分析
给定整数n,拆分成至少两个整数和,注意至少两个,可以是三个甚至是多个
将问题分解
dp[i] : 表示整数 i 拆分后得到的最大值
dp[2] :2可以分解成1+1,结果是1*1=1
dp[3] :3可以分解成1+2,结果是1*2=2
dp[4] :4可以分解成1+3或者2+2,其中1*3=3,而若3继续分解的最大值就是dp[3],显然 3>dp[3]的,故无需分解
同理2*2=4,2继续分解的最大值dp[2]只有1,2是大于dp[2]的,取2*2=4
再从两种情况下取较大值
状态转移方程如下:dp[i] = max( dp[i] , max( j*(i-j) ,j*dp[i-j] )
三,问题解答
class Solution {
public:
int integerBreak(int n) {
if(n==2){
return 1;
}
if(n==3){
return 2;
}
vector<int> dp(n+1,0); //多开辟一个空间是为了使得下标i记录的就是整数i的值
dp[2] = 1;
dp[3] = 2;
for(int i=4;i<n+1;i++){
for(int j=1;j<=i-2;j++){ //递推公式
dp[i] = max(dp[i],max(j*dp[i-j],j*(i-j)));
}
}
return dp[n];
}
};