1.3 KiB
1.3 KiB
// 拆成两个 还是拆成三个呢
思路
动态规划
- 明确dp[i]的含义
dp[i]表示 分拆数字i,可以得到的最大乘积。
- dp的初始化
初始化dp[i] = i,这里的初始化 不是为了让 i的最大乘积是dp[i],而是为了做递推公式的时候,dp[i]可以表示i这个数字,好用来做乘法。
- 递归公式
可以想 dp[i]的最大乘积是怎么得到的呢?
一定是dp[j]的最大乘积 * dp[i - j]的最大乘积,那么只需要遍历一下j(取值范围[2,i-1)),取此时dp[i]的最大值就可以了
递推公式:dp[i] = max(dp[i], dp[i - j] * dp[j]);
class Solution {
public:
int integerBreak(int n) {
if (n <= 3) return 1 * (n - 1); // 处理 2和3的情况
int dp[60];
for (int i = 0; i <= n; i++) dp[i] = i; // 初始化
for (int i = 4; i <= n ; i++) {
for (int j = 2; j < i - 1; j++) {
dp[i] = max(dp[i], dp[i - j] * dp[j]);
}
}
return dp[n];
}
};
贪心
本题也可以用贪心,但是真的需要数学证明证明其合理性,网上有很多贪心的代码,每次拆成3就可以了,代码很简单,大家如果感兴趣可以自己去查一查。
我这里就不做证明了。