链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题解:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
mem[n]表示,拆分n的最大值
class Solution {
public:
int integerBreak(int n) {
// 记忆化
vector<long> memo(n+1, INT_MIN);
dfs(n, memo);
return memo[n];
}
long dfs(long n, vector<long>& memo) {
//
if(memo[n] != INT_MIN) {
return memo[n];
}
long temp = INT_MIN;
// max(i*(n-i), i*dfs(n-i, memo))
for(int i = 1; i < n; ++i) {
long max_value = i*(n-i);
long value2 = i*dfs(n-i, memo);
if(max_value < value2) {
max_value = value2;
}
if(max_value > temp) {
temp = max_value;
}
}
memo[n] = temp;
return temp;
}
};
class Solution {
public:
int integerBreak(int n) {
std::vector<int> memo(n+1, -1);
memo[2] = 1;
dfs(n, memo);
return memo[n];
}
private:
int dfs(int n, std::vector<int>& memo) {
if (n == 0) {
return 1;
}
if (memo[n] != -1) {
return memo[n];
}
int tmp = 0;
for (int i = 1; i < n; ++i) {
int first_break = i * (n-i);
int val = n - i;
if (val < 0) {
break;
}
tmp = max(tmp, i*dfs(val, memo));
tmp = max(tmp, first_break);
}
memo[n] = tmp;
return tmp;
}
};