目录
1.509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
2.70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
3. 746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
4.62. 不同路径 - 力扣(LeetCode) (leetcode-cn.com)
5.63. 不同路径 II 题解 - 力扣(LeetCode) (leetcode-cn.com)
6.343. 整数拆分 - 力扣(LeetCode) (leetcode-cn.com)
7.96. 不同的二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)
10.416. 分割等和子集 - 力扣(LeetCode) (leetcode-cn.com)
11.1049. 最后一块石头的重量 II - 力扣(LeetCode) (leetcode-cn.com)
1.509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
核心代码模式太难受了
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
else:
dp=[]
dp.append(0)
dp.append(1)
for i in range(2,n+1):
dp.append(dp[i-1]+dp[i-2])
return dp[n]
2.70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def climbStairs(self, n: int) -> int:
if n<=2:
return n
dp=[1,2]
for i in range(3,n+1):
all = dp[0]+dp[1]
dp[0]=dp[1]
dp[1]=all
return dp[1]
3. 746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
lenofcost=len(cost)
dp=[0 for i in range(lenofcost)]
dp[0]=cost[0]
dp[1]=cost[1]
for i in range(2,lenofcost):
dp[i]=min(dp[i-1],dp[i-2])+cost[i]
return min(dp[-1],dp[-2])
4.62. 不同路径 - 力扣(LeetCode) (leetcode-cn.com)
dfs版本(只能应对小数量级)
m,n=map(int,input().split())
def dfs(i,j):
if(i>m or j>n):
return 0
if(i==m and j==n):
return 1
return dfs(i+1,j)+dfs(i,j+1)
print(dfs(1,1))
动态规划
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp=[[0 for i in range(n+1)]for j in range(m+1)]
for i in range(1,m+1):
dp[i][1]=1
for i in range(1,n+1):
dp[1][i]=1
for i in range(2,m+1):
for j in range(2,n+1):
dp[i][j]=dp[i-1][j]+dp[i][j-1]
return dp[m][n]
5.63. 不同路径 II 题解 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m=len(obstacleGrid)
n=len(obstacleGrid[0])
dp=[[0 for i in range(n)] for j in range(m)]
for i in range(m):
if obstacleGrid[i][0]==1:
break
dp[i][0]=1
for i in range(n):
if obstacleGrid[0][i]==1:
break
dp[0][i]=1
for i in range(1,m):
for j in range(1,n):
if obstacleGrid[i][j]==1:
continue
dp[i][j]=dp[i-1][j]+dp[i][j-1]
return dp[m-1][n-1]
6.343. 整数拆分 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def integerBreak(self, n: int) -> int:
dp = [0]*(n+1)
for i in range(2,n+1):
for j in range(0,i):
dp [i]=max(dp[i],j*(i-j),j*dp[i-j])
return dp[n]
7.96. 不同的二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def numTrees(self, n: int) -> int:
dp=[0]*(n+1)
dp[0]=1
for i in range(1,n+1):
for j in range(1,i+1):
dp[i]+=dp[j-1]*dp[i-j]
return dp[n]
8.01背包基础
def bag(bagsize,weight,value):
row,col=len(weight),bagsize+1
dp = [[0 for j in range(col) ]for i in range(row)]
#初始化dp数组
for i in range(1,col):
if i>=weight[0]:
dp[i]=value[0]
for i in range(1,row):
for j in range(1,col):
if j<weight[i]:
dp[i][j]=dp[i-1][j]
else:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
return dp[row-1][col-1]
9.01背包状态压缩
def bag():
weight=[1,3,4]
value=[15,20,30]
bagweight=4
dp=[0 for i in range (bagweight+1)]
for i in range(len(weight)):
for j in range(bagweight,weight[i]-1,-1):
dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
print(dp)
bag()
10.416. 分割等和子集 - 力扣(LeetCode) (leetcode-cn.com)
背包正好填满的情况
class Solution:
def canPartition(self, nums: List[int]) -> bool:
target = sum(nums)
if target%2==1:
return False
target//=2
length=len(nums)
dp=[0 for i in range(target+1)]
for i in range(length):
for j in range(target,nums[i]-1,-1):
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])
return dp[target]==target
二维数组版本
def f(nums):
nums.sort()
target = sum(nums)
if target % 2 == 1:
return False
target //= 2
dp = [[0 for i in range(target + 1)] for j in range(len(nums))]
for i in range(1, target + 1):
if i>nums[0]:
dp[0][i]=nums[0]
for i in range(1, len(nums)):
for j in range(1, target + 1):
if j<nums[i]:
dp[i][j]=dp[i-1][j]
else:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])
return dp[-1][target]==target
11.1049. 最后一块石头的重量 II - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
target = sum(stones)
target//=2
dp=[0]*(target+1)
for i in range(len(stones)):
for j in range(target,stones[i]-1,-1):
dp[j] = max(dp[j],dp[j-stones[i]]+stones[i])
ans = sum(stones) - 2*dp[target]
return ans