zoukankan      html  css  js  c++  java
  • 动态规划

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

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

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

    定义状态转移方程:明确[状态]-->定义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]
  • 相关阅读:
    Cufon css3@font-face
    HTML5 Canvas
    HTML5 Canvas 的宽高
    :nth-child()
    new Image()
    ios有些机型input和fixed导致的页面错位问题
    使用performance进行前端性能监控
    throttle(节流)和debounce(防抖)
    object-fit/object-position
    flex布局与ellipsis冲突问题
  • 原文地址:https://www.cnblogs.com/liushoudong/p/12749985.html
Copyright © 2011-2022 走看看