快捷搜索:  汽车  科技

如何通过合约地址判断项目(七爪源码动态规划)

如何通过合约地址判断项目(七爪源码动态规划)让我们通过一个问题来理解上面讨论的整个过程。收集观察结果后,请使用以下框架来解决问题。最优子结构——如果可以通过使用其子问题的最优解来获得给定问题的最优解,则给定问题具有最优子结构属性。假设我们想找到从 Source 到 Destination 的最短路径。让 Via 成为 A 和 Source 之间的中间点,用一条边将其连接到 Source。但是我们有从 Via 到 Destination 的多条路径。在这种情况下,最短(源,目标)= min(源→通过 min(通过→目标))。重叠子问题——动态规划将解决方案组合到一次又一次需要的子问题上。 DP存储子问题的结果以避免重复计算。看到问题后,请执行以下步骤:

动态编程是对递归的增强!!!

DP == 递归 记忆(自上而下)或制表(自下而上)

如何通过合约地址判断项目(七爪源码动态规划)(1)

识别 DP

寻找最大、最小、方式数或最佳等关键字。另一个提示是我们在每一步都有不同的选择/替代方案。然后寻找这个问题的答案,给定的问题是优化问题吗?

最优子结构——如果可以通过使用其子问题的最优解来获得给定问题的最优解,则给定问题具有最优子结构属性。假设我们想找到从 Source 到 Destination 的最短路径。让 Via 成为 A 和 Source 之间的中间点,用一条边将其连接到 Source。但是我们有从 Via 到 Destination 的多条路径。在这种情况下,最短(源,目标)= min(源→通过 min(通过→目标))。

重叠子问题——动态规划将解决方案组合到一次又一次需要的子问题上。 DP存储子问题的结果以避免重复计算。

看到问题后,请执行以下步骤:

  1. 可视化问题
  2. 查找子问题(后缀、前缀、子字符串)
  3. 找到子问题之间的关系
  4. 概括关系
  5. 实现子问题的顺序

收集观察结果后,请使用以下框架来解决问题。

如何通过合约地址判断项目(七爪源码动态规划)(2)

让我们通过一个问题来理解上面讨论的整个过程。

爬楼梯

你正在爬楼梯。 到达顶峰需要 n 步。 每次您可以爬 1 或 2 级台阶。 您可以通过多少种不同的方式登顶?

解决DP问题的框架

1.定义目标函数

  • f(n) 是到达第 n 个楼梯的不同方式的数量。

2. 识别基本案例最小有效输入

f(0) = 1 f(1) = 1 f(2) = 2 # f(2) can be caluculated from f(0) and f(1) as well. I have taken this just for more clarity.

3. 写下目标函数的递推关系。

f(n) = f(n-1) f(n-2)

注意:在递归中,我们一般会在每个后续函数调用中减少输入空间。 这里我们正在减少 n,如果我们有一个数组,我们可以通过增加索引(从左到右)或减少索引(从右到左)来减小数组大小。

4. 执行顺序是什么?

n → n-1 → n-2 … 1 → 0

5. 在哪里寻找答案?

f(n)

递归解决方案

class Solution: def climbStairs(self n): return self.cs_helper(n) def cs_helper(self n): if n == 0: return 0 if n == 1: return 1 if n == 2: return 2 return self.cs_helper(n - 1) self.cs_helper(n - 2)

递归 记忆

不记得过去的人,注定要重蹈覆辙。

我们使用数组来存储计算参数的结果,而不是一次又一次地使用相同的参数调用函数。

class Solution: def climbStairs(self n): memo = [None for i in range(n 1)] return self.cs_helper(n memo) def cs_helper(self n memo): if memo[n] is not None: return memo[n] if n == 0: return 0 if n == 1: result = 1 if n == 2: result = 2 else: result = self.cs_helper(n - 1 memo) self.cs_helper(n - 2 memo) memo[n] = result return result

自下而上/制表

现在我们按照框架将递归解决方案转换为线性解决方案。 由于我们使用 0、1 和 2 第二步的基本情况,我们用值 0、1、2 初始化 dp[0]、dp[1] 和 dp[2]。函数调用更改为 dp[n ] 分配,它使用最后两个位置 (dp[n-1] & dp[n-2]) 作为查找来获得答案。

class Solution: def climbStairs(self n): dp = [0] * (n 1) dp[0] dp[1] dp[2] = 0 1 2 for i in range(3 n 1): dp[i] = dp[i-1] dp[i-2] return dp[n]

在上述解决方案中,我们使用的顺序为 0 → 1 →2 →3… →n-1 →n。

DP中的空间优化

由于在每个索引处我们只查找最后两个值,我们可以删除 DP 数组并仅使用两个变量来获得结果。

class Solution: def climbStairs(self n): first = 1 second = 1 for i in range(2 n 1): res = first second first second = second res return second

自上而下和自下而上方法之间的主要区别在于,后一种方法计算所有解决方案,而第一种方法仅计算所需的解决方案。 在自下而上的方法(制表法)中,我们可以优化递归解决方案中不可能的空间复杂度。

快乐编码!

关注七爪网,获取更多APP/小程序/网站源码资源!

猜您喜欢: