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]
相关推荐
dialect_2 小时前
KMP算法
开发语言·c++·算法
reikocao2 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz3 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
前端精髓3 小时前
结构化输出with_structured_output(抽卡)
python·langchain
吞下星星的少年·-·3 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
尹人入圣4 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
是main不是漫4 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
Nuanyt4 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌4 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987375 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数