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]
相关推荐
不穿格子的程序员2 小时前
从零开始刷算法-二分-搜索插入位置
算法·二分查找
小此方2 小时前
深度解析:环形链表——手撕面试经典题
数据结构·链表·面试
only-code2 小时前
100% 本地 MCP 客户端 + SQLite 服务器(LlamaIndex + Ollama + Qwen2.5)
python·mcp
zhugby3 小时前
受限长度路径搜索算法
经验分享·算法·启发式算法·哈密顿问题·路径搜索算法
芋头莎莎3 小时前
STM32利用AES加密数据、解密数据
数据结构·stm32·算法
caron43 小时前
c++ -- 循环依赖解决方案
java·c++·算法
Kt&Rs3 小时前
11.11 LeetCode 题目汇总与解题思路
算法·leetcode·哈希算法
程序员爱钓鱼3 小时前
Python编程实战 - Python实用工具与库 - 爬虫防封与代理机制
后端·python·ipython
py有趣3 小时前
LeetCode算法学习之有效的字母异位词
学习·算法·leetcode