1. dp数组的含义:
下标:表示需要被拆分的整数
值:表示 被拆分之后 的乘积
2. 递推公式
1. j *( i - j ) 拆分成两个数,j 是其中一个因数
2. dp [ i - j] * dp [ j ] 拆分成 三个 及其三个以上 拆分 j 和 i - j
注意在写代码的时候,求最大值,需要将dp [ i ] 包括进去,因为它会记录下每次的最大值,需要更新的话,需要与它比较
3. 初始化
dp [ 0 ] dp[ 1 ] 都是不能被拆分的 ,所以初始化没有意义。
dp [ 2 ] = 1
4. 遍历顺序
这里有两层循环
第一层循环是 需要被拆分的整数
第二层循环时 寻找质因数
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1);
dp[2] = 1;
for(int i = 3 ; i <= n ; i++) // i 表示需要被拆分的数字
{
for(int j = 1 ; j < i - 1; j++) // j 是因数
dp[i] = max(max( j * (i - j), j * dp[ i - j] ), dp[i]);
}
return dp[n];
}
};