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

识别 DP
寻找最大、最小、方式数或最佳等关键字。另一个提示是我们在每一步都有不同的选择/替代方案。然后寻找这个问题的答案,给定的问题是优化问题吗?
最优子结构——如果可以通过使用其子问题的最优解来获得给定问题的最优解,则给定问题具有最优子结构属性。假设我们想找到从 Source 到 Destination 的最短路径。让 Via 成为 A 和 Source 之间的中间点,用一条边将其连接到 Source。但是我们有从 Via 到 Destination 的多条路径。在这种情况下,最短(源,目标)= min(源→通过 min(通过→目标))。
重叠子问题——动态规划将解决方案组合到一次又一次需要的子问题上。 DP存储子问题的结果以避免重复计算。
看到问题后,请执行以下步骤:
- 可视化问题
 - 查找子问题(后缀、前缀、子字符串)
 - 找到子问题之间的关系
 - 概括关系
 - 实现子问题的顺序
 
收集观察结果后,请使用以下框架来解决问题。

让我们通过一个问题来理解上面讨论的整个过程。
爬楼梯
你正在爬楼梯。 到达顶峰需要 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/小程序/网站源码资源!




