动态规划实现
初始化 dp 数组:
dp 数组的大小为 N + 1,初始值为0。
dp[1] 初始化为1,因为1颗松子无法分成两份以上。
动态规划填表:
外层循环 i 从2到 N,表示当前要处理的松子总数。
内层循环 j 从1到 i-1,表示当前选择的一份松子的数量。
更新 dp[i] 的值为 j * max(i - j, dp[i - j]),即当前选择的松子数量 j 乘以剩余松子的最大饱腹值 max(i - j, dp[i - j])。
输出结果:
最终 dp[N] 即为将 N 颗松子分成若干份后的最大饱腹值。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxProductAfterSplitting(int N) {
vector<int> dp(N + 1, 0);
dp[1] = 1;
// 动态规划填表
for (int i = 2; i <= N; ++i) {
for (int j = 1; j < i; ++j) {
dp[i] = max(dp[i], j * max(i - j, dp[i - j]));
}
}
return dp[N];
}
int main() {
int N;
cin >> N;
int result = maxProductAfterSplitting(N);
cout << result << endl;
return 0;
}