代码随想录算法训练营第四十三天|343. 整数拆分、96.不同的二叉搜索树

代码随想录算法训练营第四十三天

343. 整数拆分

题目链接:343. 整数拆分

  1. 确定dp数组以及下标的含义:i要拆的数字,dp[i]拆完数字的乘积
  2. 确定递推公式:每个循环都要面临3种情况,不拆,拆成2个,拆成1个+另一个再拆:
    dp[i],j*(i-j),j*dp[i-j],这3个值里面取最大的
  3. dp数组如何初始化:dp[0]=0,dp[1]=1,dp[2] =1*2
  4. 确定遍历顺序:从小到大
  5. 打印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.不同的二叉搜索树

  1. 确定dp数组以及下标的含义:i是节点个数,dp[i]是i个节点可以组成的二叉搜索树种类
  2. 确定递推公式:i个节点种类数=以1为头结点+以2为头结点+~+以j为头结点的种类数,以j为头结点的种类等于左子树种类*右子树种类,左子树种类=dp[j-1],右子树种类 = dp[i-j],dp[i]+=dp[j-1]*dp[i-j];
  3. dp数组如何初始化:dp[0]=1,dp[1]=1,dp[2] =2
  4. 确定遍历顺序:从小到大
  5. 打印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];

    }
};

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值