题目:
代码(首刷看解析 2024年2月21日):
dp[i]表示i所能拆分的最大乘积,则dp[i] 与dp[i - 1]的递推公式是:
max( 1~n * dp[n ~ 1])
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1);
dp[2] = 1;
for (int i = 3; i <= n; ++i) {
for (int j = 1; j < i - 1; ++j) {
dp[i] = max(dp[i],max((j * dp[i - j]), j * (i - j)));
}
}
return dp[n];
}
};
代码(二刷看了眼思路 2024年6月19日 go)
func integerBreak(n int) int {
// dp[i]表示i所能拆分的最大乘积
// dp[i] = max(dp[i - 1] * 1, dp[i - 2] * 2, dp[i - 3] * 3 ... dp[1] * (i - 1))
dp := make([]int, n + 1)
dp[2] = 1
for i := 3; i <= n; i++ {
for j := 1; j < i; j++ {
// 这里不但要考虑dp[j] * (i - j)的情况,还要考虑 j * (i - j)的情况
// 这是因为有时候 j > dp[j],这时j就不用再拆分
dp[i] = max(dp[i], max(dp[j] * (i - j), j * (i - j)))
// fmt.Print("dp[ ",i," ]:",dp[i]," ")
}
// fmt.Print("\n")
}
return dp[n]
}
func max(a, b int) int {
if a > b {
return a
}
return b
}