代码随想录算法训练营第41天 |动态规划-两道题都不会343、96

总结

1.如果直接看两个代码,发现都是for循环嵌套,但是内部逻辑是,对于一个i来说,要遍历i之前的所有数的状态(dp[i]),目的是:求最大,或者要叠加之前所有状态(并不是有限状态,比如不同路径,或者跳台阶、斐波那契数列)。

343. 整数拆分

题目链接:

leecode-343

自己想

不会

看完题解

1.确定dp[i]表示,当拆分数字是i时,dp[i]为最大乘积和
2.关键点在于递推公式:如何确定dp[i],
dp[i]分两种情况,假设j从0到i-1,那么dp[i]是:j ∗ * (i-j)或者dp[j] ∗ * (i-j)的值,dp[j] ∗ * (i-j)可以理解为将dp[i]拆分成多种情况计算,而j ∗ * (i-j) 将dp[i]拆分成两种情况。
3.初始化:
4.

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

96. 不同的二叉搜索树

题目链接:

leecode-96

自己想

1.毫无思路

看完题解

1.模拟一遍节点数为1的情况,模拟一遍节点数为2的情况,模拟一遍节点数为3的情况。然后看之间的关系,推导一下递推公式。这块儿好难。找到共性,什么导致了二叉树的不同,或者二叉树应该怎样分类?就是当根节点为1时,根节点为2时,根节点为3时->然后不考虑根节点,看剩余部分和以前值有没有关系。
2.根据推导公式,确定dp[i]表示当节点数为i时,dp[i]为不同二叉搜索树的个数。
3.转化递推公式:dp[i]+=dp[j-1]*dp[i-j]
4.初始化
5.举例

完整代码
class Solution:
    def numTrees(self, n: int) -> int:

        dp = [0 for i in range(0,n+1)]
        dp[1] = 1
        dp[0] = 1
        for i in range(2,n+1):
            for j in range(1,i+1):
                dp[i]+=dp[j-1]*dp[i-j]
        
        return dp[n]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值