代码随想录算法训练营 Day41 动态规划3

Day41 动态规划3

343. 整数拆分

思路

不知道如何拆分,才能使乘积最大化
有什么理论依据?

根据代码随想录
拆分使乘积最大化逻辑:应该尽可能拆成相同的数

根据题目,发现,拆分后的数可以继续拆分,因此可以用动规的思路

要点:

  1. dp数组含义 对i进行拆分,得到最大乘积为dp[i]
  2. 递推公式:
    如果拆成两个数:j * (i - j)
    如果拆成三个数以上:j * dp[i - j]
    递推公式可以将所有的情况都考虑,在比较取最大值就行;因此不知道上述逻辑也能写

最终代码:

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[0] = 0
        dp[1] = 0
        dp[2] = 1
        for i in range(3, n + 1):
            for j in range(1, i // 2 + 1):
                dp[i] = max(j * (i - j), j * dp[i - j], dp[i])
        return dp[n]

总结:
一开始不知道怎么拆最大,觉得会有一个特别的逻辑,但是实际写代码的时候,是一个暴力的方式将所有的情况都考虑,再比较取值的。

96.不同的二叉搜索树

思路

dp[i]的结果可以看作根节点为1到i的二叉搜索树种数之和
但是不同n,根节点为i得到的结果也不同
不知道怎么想递推公式

根据代码随想录
首先,根据样例观察规律
n = 3
1为根节点以及3为根节点,右子树的分布和n为2的布局是一样的
2为根节点,左右子树的分布根n为1一样

总共和 = 根节点为1的情况 + 根节点为2 + 根节点为3
根节点为1 = 左子树0个节点 * 右子树2个节点
根2 = 左子树1个节点 * 右子树1个节点
根3 = 左子树2个节点 * 右子树0个节点

n = 3可以根据0,1,2三种情况推导出来

j 为根节点,左边有j - 1个节点,右面有i - j个节点

最终代码:

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[0] = 1
        for i in range(1, n + 1):
            for j in range(1, i + 1):
                dp[i] += dp[j - 1] * dp[i - j]
        return dp[n]

总结
这题有点难,没做过想不到怎么做

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 05:32:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 05:32:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 05:32:05       87 阅读
  4. Python语言-面向对象

    2024-04-02 05:32:05       96 阅读

热门阅读

  1. 【DevOps工具篇】LDAP GUI管理工具

    2024-04-02 05:32:05       38 阅读
  2. 工作常用Linux命令记录

    2024-04-02 05:32:05       37 阅读
  3. 数据挖掘比赛比较基础的baseline

    2024-04-02 05:32:05       31 阅读
  4. 为您的行业选择最合适的服务器

    2024-04-02 05:32:05       40 阅读
  5. 竞赛常考的知识点大总结(七)图论

    2024-04-02 05:32:05       36 阅读
  6. .NET Framework 3.5框架如何使用RSA加密

    2024-04-02 05:32:05       39 阅读
  7. 洛伦兹系统ODE方程-MATLAB

    2024-04-02 05:32:05       30 阅读
  8. 软件测试-第四章课后作业

    2024-04-02 05:32:05       41 阅读
  9. 在保存原容器的情况下重新安装docker

    2024-04-02 05:32:05       40 阅读
  10. http协议中的“队头阻塞”问题

    2024-04-02 05:32:05       38 阅读