本题要求拆分正整数并求得乘积的最大值,首先设置dp数组,其中dp[i]的含义是拆分正整数i的乘积最大值,因此dp[i]递推公式为max(dp[i],max(j*(i-j),j*dp[i-j])),其中求得了拆分为两个正整数乘积和拆分为两个以上正整数乘积的最大值,而j是从1到i遍历,因此在dp[i-j]中会拆分出j的乘积值。
具体代码如下:
class Solution {
public:
int integerBreak(int n) {
vector<int>dp(n+1);
dp[0]=0;
dp[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),j*dp[i-j]));
}
}
return dp[n];
}
};
本题要求二叉搜索树有多少种,可以从树的根结点开始拆分,将左子树的二叉树结点数可以构成的二叉搜索树的种数乘右子树可以构成的二叉搜索树的种数即为所求。因此,构建dp数组,dp[i]的含义是值为i的二叉搜索树有多少种,通过将1-i-1分别作为二叉树的根结点,利用上述的递推公式求出dp[i]的值。
具体代码如下:
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=1;j<=i;j++)
{
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};
文章介绍了如何使用动态规划解决LeetCode中的两道题目:第343题通过dp数组计算拆分正整数的乘积最大值,第96题计算给定值的二叉搜索树有多少种。详细解释了递推公式和代码实现。
1325

被折叠的 条评论
为什么被折叠?



