class Solution {
public:
int integerBreak(int n) {
/*
dp[i] : 正整数 i 拆分为k个数(和为i)的最大乘积
dp[i] = max(dp[i - 1] * 1, dp[i - 2] * 2, dp[i - 3] * 3, ... , dp[1] * (i - 1),
(i - 1) * 1, (i - 2) * 2, ... , 1 * (i - 1))
1: dp[i - j] * j -> 拆分为3个数以上,j作为单独留出来数的遍历,dp[i - j]包含至少2个数
2:(i - j) * j -> 拆分为2个数
*/
vector<int> dp(n + 1);
dp[1] = 1; // 初始值
for(int i = 2; i <= n; i ++){
for(int j = 1; j <= i - 1; j ++){ //这里j 可以只循环一半 j <= i / 2
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); // max(int a, int b)只能传2个数所以要嵌套
}
}
return dp[n];
}
};
<Talk is cheap, show me the code 05> LeetCode.343 整数拆分
于 2024-06-25 17:48:32 首次发布