343. 整数拆分
题目链接:343. 整数拆分
文档讲解:代码随想录
思路
- 确定dp数组以及下标的含义:dp[i]表示拆分数字i,可以得到的最大乘积为dp[i]
- 确定递推公式:dp[i] = max(dp[i], max(j * (i - j), dp[j] * (i - j))), where j = 1-i-1
- dp数组如何初始化:dp[2] = 1
- 遍历顺序:从前向后遍历
代码
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1, 0);
dp[2] = 1;
for (int i = 3; i <= n; i++) {
for (int j = 1; j < i; j++) {
dp[i] = max(dp[i], max(j * (i - j), dp[j] * (i - j)));
}
}
return dp[n];
}
};
96.不同的二叉搜索树
题目链接:96.不同的二叉搜索树
文档讲解:代码随想录
思路
- 确定dp数组以及下标的含义:dp[i]表示i个结点组成的二叉搜索树的个数为dp[i]
- 确定递推公式:dp[i] += dp[i - j] * dp[j - 1], where j = 1 - i,以每个元素j为根结点,左边的元素小于j,有j - 1个,右边的元素大于j,有i - j个,两边各组成一个二叉搜索树。
- dp数组如何初始化:dp[0] = 1
- 遍历顺序:从前向后遍历
代码
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
if (n == 1)
return 1;
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
};