方法:dp
class Solution {
#define maxn 60
int dp[maxn];
public:
int integerBreak(int n) {
dp[2] = 1;
for (int i = 3; i <= n; ++i)
for (int j = 1; j <= i / 2; ++j) {
dp[i] = max(dp[i], max(dp[i - j] * j, (i-j) * j));
}
return dp[n];
}
};
$时间复杂度O(),空间复杂度O(n)
方法:贪心
class Solution {
public:
int integerBreak(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
if(n == 4) return 4;
int res = 1;
while(n > 4) {
res *= 3;
n -= 3;
}
res *= n;
return res;
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:dp
class Solution {
#define maxn 20
int dp[maxn];
public:
int numTrees(int n) {
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
};
$时间复杂度O(),空间复杂度O(n)