代码随想录算法训练营第四十三天
343. 整数拆分
题目链接:343. 整数拆分
- 确定dp数组以及下标的含义:i要拆的数字,dp[i]拆完数字的乘积
- 确定递推公式:每个循环都要面临3种情况,不拆,拆成2个,拆成1个+另一个再拆:
dp[i],j*(i-j),j*dp[i-j],这3个值里面取最大的 - dp数组如何初始化:dp[0]=0,dp[1]=1,dp[2] =1*2
- 确定遍历顺序:从小到大
- 打印dp数组。
class Solution {
public:
int integerBreak(int n) {
vector<int>dp(n+1);
dp[0] =0;
dp[1] =1;
dp[2] =1;
for(int i =3;i<=n;i++){
for(int j = 1;j<=i/2;j++){
dp[i] = max((i-j)*j,max(dp[i],dp[i-j]*j));//每个循环都要面临3种情况,不拆,拆成2个,拆成1个+另一个再拆
}
}
return dp[n];
}
};
96.不同的二叉搜索树
题目链接:96.不同的二叉搜索树
- 确定dp数组以及下标的含义:i是节点个数,dp[i]是i个节点可以组成的二叉搜索树种类
- 确定递推公式:i个节点种类数=以1为头结点+以2为头结点+~+以j为头结点的种类数,以j为头结点的种类等于左子树种类*右子树种类,左子树种类=dp[j-1],右子树种类 = dp[i-j],dp[i]+=dp[j-1]*dp[i-j];
- dp数组如何初始化:dp[0]=1,dp[1]=1,dp[2] =2
- 确定遍历顺序:从小到大
- 打印dp数组。
class Solution {
public:
int numTrees(int n) {
vector<int>dp(n+2);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i =3;i<=n;i++){
for(int j =1;j<=i;j++){
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};