• 动态规划


    动态规划问题的一般形式:求最值、求最长递增子序列、最小编辑距离

    动态规划问题一定具备最优子结构

    重叠子问题、最优子结构、状态转移方程

    定义状态转移方程:明确[状态]-->定义dp数组/函数的含义-->明确[选择]-->明确base case

    1 def fib(n):
    2     if n == 1 or n == 2:
    3         return 1
    4     return fib(n-1) + fib(n-2)
     # 带备忘录的递归解法-->自顶向下的动态规划
    1
    def fib(n): 2 memo = [0 for i in range(n+1)] 3 return helper(memo, n) 4 5 def helper(memo, n): 6 if n==1 or n == 2: 7 return 1 8 if memo[n] != 0: 9 return memo[n] 10 memo[n] = helper(memo, n-1) + helper(memo, n-2) 11 return memo[n]
    1 # 动态规划解法-->自底向上的迭代解法
    2 def fib(n):
    3     dp = [0 for i in range(n+1)]
    4     dp[1] = dp[2] = 1
    5     for i in range(3, n+1):
    6         dp[i] = dp[i-1] + dp[i-2]
    7     return dp[n]
    1 # 优化
    2 def fib(n):
    3     dp1 = dp2 = 1
    4     for i in range(3, n+1):
    5         dp1, dp2 = dp2, dp1+dp2
    6     return dp2

    凑零钱问题

     1 # 递归
     2 def coinChange(coins, amount):
     3     # 定义:要凑出金额n,至少要dp(n)个硬币
     4     def dp(n):
     5         # base case
     6         if n == 0: return 0
     7         if n < 0: return -1
     8         # 做选择,需要硬币最少的那个结果就是答案
     9         res = float('inf')
    10         for coin in coins:
    11             subproblem = dp(n - coin)
    12             if subproblem == -1:
    13                 continue
    14             res = min(res, 1 + subproblem)
    15         return res if res != float('inf') else -1
    16     return dp[amount]
     1 def coinChange(coins, amount):
     2     memo = {}
     3     def dp(n):
     4         if n in memo:
     5             return memo[n]
     6         if n == 0:
     7             return 0
     8         if n < 0:
     9             return -1
    10         res = float('inf')
    11         for coin in coins:
    12             subproblem = dp(n-cpin)
    13             if subproblem == -1:
    14                 continue
    15             res = min(res, 1 + subproblem)
    16 
    17         memo[n] = res if res != float('inf') else -1
    18     return dp(amount)
    1 def coinChange(coins, amount):
    2     dp = [amount + 1 for i in range(amount+1)]
    3     for i in range(amount+1):
    4         for coin in coins:
    5             if i - coin < 0:
    6                 continue
    7             dp[i] = min(dp[i], 1 + dp[i - coin])
    8     return -1 if dp[amount] == amount+1 else dp[amount]
  • 相关阅读:
    无法删除文件提示找不到指定文件导致文件无法删除的解决方法
    c++多线程编程(三)
    c++多线程编程(二)
    c++多线程编程(一)
    面试中的C++常见问题
    展示组件(Presentational component)和容器组件(Container component)之间有何不同
    如果你创建了类似于下面的 Twitter 元素,那么它相关的类定义是啥样子的?
    React 中 refs 的作用是什么?
    typescript 类(类的定义、继承、修饰符、抽象类)
    typescript 接口 interface
  • 原文地址:https://www.cnblogs.com/liushoudong/p/12749985.html
Copyright © 2020-2023  润新知