Day33-动态规划
1. 不同路径-62
62. 不同路径 - 力扣(LeetCode)
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] = 1for j in range(n):dp[0][j] =1for 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)
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 1for i in range(1,m):dp[i][0]=0 if obstacleGrid[i][0] or not dp[i-1][0] else 1for j in range(1,n):dp[0][j]=0 if obstacleGrid[0][j] or not dp[0][j-1] else 1for 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]
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 1for i in range(m):if obstacleGrid[i][0]:breakdp[i][0]=1for j in range(n):if obstacleGrid[0][j]:breakdp[0][j]=1for 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)
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]都没有意义,就是0if 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)
class Solution(object):def numTrees(self, n):""":type n: int:rtype: int"""# dp[i]有多棵树# dp[i]其实就是确定一个头节点,然后左子树的个数乘以右子树的个数,对所有情况进行加和!# dp[0]也是1dp=[1,1]if n==1:return 1for 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]
