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]
相关推荐
猿界零零七18 分钟前
pip install mxnet 报错解决方案
python·pip·mxnet
I_LPL1 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱1 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073212 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
不只会拍照的程序猿2 小时前
《嵌入式AI筑基笔记02:Python数据类型01,从C的“硬核”到Python的“包容”》
人工智能·笔记·python
Jay_Franklin2 小时前
Quarto与Python集成使用
开发语言·python·markdown
2401_831824963 小时前
代码性能剖析工具
开发语言·c++·算法
Oueii3 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
2401_831824964 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
Sunshine for you4 小时前
C++中的职责链模式实战
开发语言·c++·算法