动态规划_leetcode62

此博客为转载内容,转载自https://www.cnblogs.com/lux-ace/p/10546252.html ,涉及数据结构与算法领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#coding=utf-8

# 递归


# 深度优先遍历,找全路径 20190306 找工作期间
class Solution1(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""

if m == 0 and n == 0:
return

self.m = m
self.n = n
self.res = 0

self.direction = [[0,1],[1,0]]

self.visit = [[False for i in range(n)] for i in range(m)]

self.findPath(0,0)

print self.res

return self.res


def inArea(self,x,y):
return x >= 0 and x < self.m and y >= 0 and y < self.n

def findPath(self,x,y):

if x == self.m-1 and y == self.n-1:
self.res += 1
return



self.visit[x][y] = True

for item in self.direction:
newX = x + item[0]
newY = y + item[1]

if self.inArea(newX,newY) and not self.visit[newX][newY]:
self.findPath(newX,newY)

self.visit[x][y] = False




# s = Solution1()
#
# s.uniquePaths(23,12)



# 记忆化递归
class Solution2(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""

if m == 0 and n == 0:
return

self.m = m
self.n = n

self.res = 0

# memo[x][y] 矩阵的方案数
# 矩阵坐标[x][y] 到 矩阵[1][1]的 路径数
self.memo = [[-1 for i in range(n+1)] for i in range(m+1)]

for i in range(n+1):
self.memo[0][i] = 0

for i in range(m+1):
self.memo[i][0] = 0

self.memo[1][1] = 1

#self.visit = [[False for i in range(n)] for i in range(m)]

return self.findPath(m, n)

def findPath(self, x, y):

if x == 1 and y == 1:
return 1

if x == 0 or y == 0: return 0 # # self.memo[x][y] = self.memo[x-1][y] + self.memo[x][y-1] if self.memo[x][y] == -1: if self.memo[x-1][y] != -1: self.memo[x][y] = self.memo[x-1][y] elif self.memo[x-1][y] == -1: self.memo[x-1][y] = self.findPath(x-1,y) self.memo[x][y] = self.memo[x - 1][y] if self.memo[x][y-1] != -1: self.memo[x][y] += self.memo[x][y-1] elif self.memo[x][y-1] == -1: self.memo[x][y-1] = self.findPath(x,y-1) self.memo[x][y] += self.memo[x][y-1] return self.memo[x][y]# s = Solution2()## print s.uniquePaths(23,12)# 动态规划class Solution3(object): def uniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ if m == 0 and n == 0: return return self.findPath(m, n) def findPath(self, m, n): # memo[x][y] 矩阵的方案数 memo = [[-1 for i in range(n + 1)] for i in range(m + 1)] for i in range(n + 1): memo[0][i] = 0 for i in range(m + 1): memo[i][0] = 0 memo[1][1] = 1 for i in range(1,m+1): for j in range(1,n+1): if i == 1 and j == 1: continue memo[i][j] = memo[i-1][j] +memo[i][j-1] return memo[m][n]s = Solution3()print s.uniquePaths(7,3)

转载于:https://www.cnblogs.com/lux-ace/p/10546252.html

### LeetCode 动态规划题目及其解法 #### 不同路径 (LeetCode 62) 此题属于动态规划的经典应用之一,在给定 m 和 n 的情况下,计算从左下角到右上角的不同路径数量。网格中的移动仅限于向右或向上。 对于这个问题,可以通过构建一个二维数组 `dp` 来表示到达每一个格子的方法数。初始化时,考虑到边界上的点只有一种方式可达(即沿着边走),因此这些位置都设为1。其余的位置则遵循状态转移方程: \[ \text{dp}[i][j] = \text{dp}[i-1][j] + \text{dp}[i][j-1] \] 这里 \( i, j \geq 1 \),而当 \( i=0 \) 或者 \( j=0 \) 时,则保持默认值1不变[^1]。 ```python def uniquePaths(m: int, n: int) -> int: # 创建m*n大小的全1矩阵作为初始条件 dp = [[1]*n for _ in range(m)] 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[-1][-1] ``` #### 零钱兑换 (LeetCode 322) 该问题是典型的完全背包问题变种,目标是在给定若干不同面额硬币的情况下找到凑成特定金额所需的最少硬币数目。如果无法恰好组成所需金额,则返回 `-1` 表明无解。 为了求解最小硬币数目的组合,同样采用动态规划策略。定义一维数组 `dp` ,其中索引代表当前尝试达到的目标金额,元素值则是对应金额下的最优解——也就是所需要的最少硬币数量。遍历所有可能使用的硬币种类,并更新相应的 `dp` 值直到覆盖整个范围内的可能性。最终得到的结果就是所求的答案[^2]。 ```python from typing import List def coinChange(coins: List[int], amount: int) -> int: MAX = float('inf') dp = [0] + [MAX] * amount for i in range(1, amount + 1): dp[i] = min([dp[i - c] if i - c >= 0 else MAX for c in coins]) + 1 return dp[amount] if dp[amount] != MAX else -1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值