Day33-动态规划

1. 不同路径-62

62. 不同路径 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        # dp[i][j]表示i到j有多少种走法
        # dp[0][0]是1【其实也可以理解,不需要走也是一种走法】
        dp = [[0]*n for _ in range(m)]
        for i in range(m):
            dp[i][0] = 1
        for j in range(n):
            dp[0][j] =1
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = dp[i-1][j]+dp[i][j-1]
        return dp[m-1][n-1]

2. 不同路径II-63

63. 不同路径 II - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0]*n for _ in range(m)]
        dp[0][0] = 0 if obstacleGrid[0][0] else 1
        for i in range(1,m):
            dp[i][0]=0 if obstacleGrid[i][0] or not dp[i-1][0] else 1
        for j in range(1,n):
            dp[0][j]=0 if obstacleGrid[0][j] or not dp[0][j-1] else 1
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = 0 if obstacleGrid[i][j] else dp[i][j-1]+dp[i-1][j]
        return dp[m-1][n-1]
python 复制代码
class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0]*n for _ in range(m)]
        # dp[0][0] = 0 if obstacleGrid[0][0] else 1
        # for i in range(1,m):
        #     dp[i][0]=0 if obstacleGrid[i][0] or not dp[i-1][0] else 1
        # for j in range(1,n):
        #     dp[0][j]=0 if obstacleGrid[0][j] or not dp[0][j-1] else 1
        for i in range(m):
            if obstacleGrid[i][0]:
                break
            dp[i][0]=1
        for j in range(n):
            if obstacleGrid[0][j]:
                break
            dp[0][j]=1
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = 0 if obstacleGrid[i][j] else dp[i][j-1]+dp[i-1][j]
        return dp[m-1][n-1]

3. 整数拆分-343

343. 整数拆分 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        # dp[n]就是n拆分后得到的乘积最大值
        # dp[i]=max(j*dp[i-j])
        dp=[0,0,1]  # dp[0]和dp[1]都没有意义,就是0
        if n==2:
            return dp[2]
        for i in range(3,n+1):
            dp.append(i-1)
            for j in range(2,i//2+1):  # 优化
                dp[i] = max(dp[i],dp[i-j]*j,(i-j)*j)
        return dp[n]

4. 不同的二叉搜索树-96

96. 不同的二叉搜索树 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        # dp[i]有多棵树
        # dp[i]其实就是确定一个头节点,然后左子树的个数乘以右子树的个数,对所有情况进行加和!
        # dp[0]也是1
        dp=[1,1]
        if n==1:
            return 1
        for i in range(2,n+1):
            dp.append(0)
            for j in range(1,i+1):
                dp[i]+=dp[j-1]*dp[i-j]
        return dp[n]
相关推荐
醒过来摸鱼4 小时前
Java classloader
java·开发语言·python
superman超哥4 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…4 小时前
Python - 继承
开发语言·python
祁思妙想4 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
LYFlied5 小时前
【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值
数据结构·算法·leetcode·面试·职场和发展
唐装鼠5 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Dingdangcat865 小时前
反恐精英角色识别与定位-基于改进的boxinst_r101_fpn_ms-90k_coco模型实现
python
世界唯一最大变量5 小时前
利用自定义积分公式,目前可以求出所有1元方程和1元积分的近似值
python
写代码的【黑咖啡】5 小时前
深入理解 Python 中的模块(Module)
开发语言·python
ytttr8736 小时前
MATLAB基于LDA的人脸识别算法实现(ORL数据库)
数据库·算法·matlab