一、整数拆分-LeetCode 343
Leecode链接: leetcode 343
文章链接: 代码随想录
视频链接: B站
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
思路
初始化dp数组,数组含义为:第i个数的最大乘积的值,递推公式为:dp[i] = max(j * (i - j),j * dp[i-j])。
实现代码
//cpp
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;j++){
dp[i] = max(dp[i],max((i-j)*j,dp[i-j]*j));
}
}
return dp[n];
}
};
个人问题
递推公式没有完善好,写成了dp[j] * dp[i-j]。
总结
需要把握好一个数的最大乘积一般是两个相同的数相乘,在拆分成三个以上的数相乘时,只需要写j * dp[i-j]即可,因为j不需要拆分,如果拆分,那就是四个数相乘了。
二、不同的二叉搜索树-LeetCode 96
Leecode链接: LeetCode 96
文章链接: 代码随想录
视频链接: B站
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例:
输入:n = 3
输出:5
思路
初始化dp数组,数组的含义为:n个整数组成的二叉搜索树有多少种,递推公式为dp[i] += dp[j - 1] * dp[i - j]。
实现代码
//cpp
class Solution {
public:
int numTrees(int n) {
vector<int>dp(n+1);
dp[0] = 1;
for(int i = 1;i<=n;i++){
for(int j = 0;j<=i-1;j++){
dp[i] += dp[j]*dp[i-1-j];
}
}
return dp[n];
}
};
个人问题
没有想到思路。
总结
把握好树二叉搜索树的种类 = 左子树的搜索树种类+右子树的搜索树种类。dp[1] = 1,dp[2] = 2,即可得到dp[3]的值。